From dfce7f15489de5e94d9476dc76e33e2b60672130 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Thu, 1 Apr 2021 09:45:17 -0600 Subject: [PATCH 001/225] add auto read signposts --- data/event_scripts.s | 4 + .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes include/constants/metatile_behaviors.h | 2 +- include/event_scripts.h | 2 + include/field_control_avatar.h | 1 + include/field_message_box.h | 2 + include/metatile_behavior.h | 1 + include/script.h | 8 ++ include/text_window.h | 1 + src/field_control_avatar.c | 124 +++++++++++++++++- src/field_message_box.c | 10 +- src/metatile_behavior.c | 8 +- src/overworld.c | 1 + src/scrcmd.c | 2 + src/script.c | 35 +++++ src/text_window.c | 9 ++ 16 files changed, 206 insertions(+), 4 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 8039be6876..886c55f71c 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -690,6 +690,10 @@ EventScript_BackupMrBrineyLocation:: @ 8271E95 .include "data/scripts/rival_graphics.inc" .include "data/scripts/set_gym_trainers.inc" +EventScript_CancelMessageBox:: + release + end + Common_EventScript_ShowBagIsFull:: @ 8272054 msgbox gText_TooBadBagIsFull, MSGBOX_DEFAULT release diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index d9cd29016d792fb568494dbf2f820100081a14f8..af9326451d561c4103afe500c5ae8c7656092fc6 100644 GIT binary patch delta 21 ZcmZqRXy9OH00Y^H?D~wd8_iEL0{|lp1I_>d delta 21 YcmZqRXy9OHfPjhY`iu-4%}+7|03liflmGw# diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 94cb0ffcaa..cd2f70fe0f 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -30,7 +30,7 @@ #define MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2 0x1A #define MB_STAIRS_OUTSIDE_ABANDONED_SHIP 0x1B #define MB_SHOAL_CAVE_ENTRANCE 0x1C -#define MB_UNUSED_1D 0x1D +#define MB_SIGNPOST 0x1D #define MB_UNUSED_1E 0x1E #define MB_UNUSED_1F 0x1F #define MB_ICE 0x20 diff --git a/include/event_scripts.h b/include/event_scripts.h index 79ef0ea142..eff980f138 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -610,4 +610,6 @@ extern const u8 EventScript_TradeCenter_Chair0[]; extern const u8 EventScript_ConfirmLeaveTradeRoom[]; extern const u8 EventScript_TerminateLink[]; +extern const u8 EventScript_CancelMessageBox[]; + #endif // GUARD_EVENT_SCRIPTS_H diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h index 17e5afb63e..e6c90e8e5b 100644 --- a/include/field_control_avatar.h +++ b/include/field_control_avatar.h @@ -40,5 +40,6 @@ u8 TrySetDiveWarp(void); const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction); u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position); void ClearPoisonStepCounter(void); +void FieldInput_HandleCancelSignpost(struct FieldInput *input); #endif // GUARD_FIELDCONTROLAVATAR_H diff --git a/include/field_message_box.h b/include/field_message_box.h index 34b3324e72..eed6c7a9c0 100644 --- a/include/field_message_box.h +++ b/include/field_message_box.h @@ -19,4 +19,6 @@ u8 GetFieldMessageBoxMode(void); void StopFieldMessage(void); void InitFieldMessageBox(void); +extern u8 gWalkAwayFromSignInhibitTimer; + #endif // GUARD_FIELD_MESSAGE_BOX_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index d4bd9e6832..886422e63e 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -145,5 +145,6 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); +bool8 MetatileBehavior_IsSignpost(u8 mb); #endif // GUARD_METATILE_BEHAVIOR diff --git a/include/script.h b/include/script.h index 63f6f5aef9..92309eb653 100644 --- a/include/script.h +++ b/include/script.h @@ -62,4 +62,12 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize); // srccmd.h void SetMovingNpcId(u16 npcId); +// auto read signs +void SetWalkingIntoSignVars(void); +void MsgSetSignPost(void); +void ResetFacingNpcOrSignPostVars(void); +bool32 IsMsgSignPost(void); +bool32 CanWalkAwayToCancelMsgBox(void); +void ClearMsgBoxCancelableState(void); + #endif // GUARD_SCRIPT_H diff --git a/include/text_window.h b/include/text_window.h index 7bdcacd17c..d6bf83e0b3 100644 --- a/include/text_window.h +++ b/include/text_window.h @@ -23,5 +23,6 @@ void rbox_fill_rectangle(u8 windowId); const u16 *GetTextWindowPalette(u8 id); const u16 *GetOverworldTextboxPalettePtr(void); void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset); +void LoadSignPostWindowFrameGfx(void); #endif // GUARD_TEXT_WINDOW_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 6ec280fd0d..16e334f429 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -9,6 +9,7 @@ #include "event_scripts.h" #include "fieldmap.h" #include "field_control_avatar.h" +#include "field_message_box.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_screen_effect.h" @@ -41,6 +42,13 @@ static EWRAM_DATA u16 sPreviousPlayerMetatileBehavior = 0; u8 gSelectedObjectEvent; +#define SIGNPOST_POKECENTER 0 +#define SIGNPOST_POKEMART 1 +#define SIGNPOST_INDIGO_1 2 +#define SIGNPOST_INDIGO_2 3 +#define SIGNPOST_SCRIPTED 240 +#define SIGNPOST_NA 255 + static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); static u16 GetPlayerCurMetatileBehavior(int); @@ -69,6 +77,10 @@ static bool8 TryStartMiscWalkingScripts(u16); static bool8 TryStartStepCountScript(u16); static void UpdateFriendshipStepCounter(void); static bool8 UpdatePoisonStepCounter(void); +static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); +static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); +static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position); void FieldClearPlayerInput(struct FieldInput *input) { @@ -140,7 +152,8 @@ int ProcessPlayerFieldInput(struct FieldInput *input) gSpecialVar_LastTalked = 0; gSelectedObjectEvent = 0; - + + ResetFacingNpcOrSignPostVars(); playerDirection = GetPlayerFacingDirection(); GetPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); @@ -160,6 +173,20 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; } + + if (input->checkStandardWildEncounter) + { + if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } + } + if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; if (input->heldDirection && input->dpadDirection == playerDirection) @@ -170,6 +197,13 @@ int ProcessPlayerFieldInput(struct FieldInput *input) GetInFrontOfPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + + if (input->heldDirection && input->dpadDirection == playerDirection) + { + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + } + if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; @@ -1005,3 +1039,91 @@ int SetCableClubWarp(void) SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); return 0; } + +// auto read signposts +// signposts +static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 metatileBehavior, u8 playerDirection) +{ + u8 signpostType; + const u8 *script; + + if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) + return FALSE; + if (playerDirection != DIR_NORTH) + return FALSE; + + switch (GetFacingSignpostType(metatileBehavior, playerDirection)) + { + /* leaving this commented out for examples of custom signpost types + case SIGNPOST_POKECENTER: + SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection); + return TRUE; + case SIGNPOST_POKEMART: + SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection); + return TRUE;*/ + case SIGNPOST_SCRIPTED: + script = GetSignpostScriptAtMapPosition(position); + if (script == NULL) + return FALSE; + SetUpWalkIntoSignScript(script, playerDirection); + return TRUE; + default: + return FALSE; + } +} + +static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) +{ + /*if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, playerDirection) == TRUE) + return SIGNPOST_POKECENTER; + if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE) + return SIGNPOST_POKEMART;*/ + + if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) + return SIGNPOST_SCRIPTED; + + return SIGNPOST_NA; +} + +static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) +{ + gSpecialVar_Facing = playerDirection; + ScriptContext1_SetupScript(script); + SetWalkingIntoSignVars(); + MsgSetSignPost(); +} + +static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) +{ + const struct BgEvent *event = GetBackgroundEventAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + if (event == NULL) + return NULL; + if (event->bgUnion.script != NULL) + return event->bgUnion.script; + return EventScript_TestSignpostMsg; +} + +void FieldInput_HandleCancelSignpost(struct FieldInput *input) +{ + if (ScriptContext1_IsScriptSetUp() == TRUE) + { + if (gWalkAwayFromSignInhibitTimer != 0) + { + gWalkAwayFromSignInhibitTimer--; + } + else if (CanWalkAwayToCancelMsgBox() == TRUE) + { + //ClearMsgBoxCancelableState(); + if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection) + { + ScriptContext1_SetupScript(EventScript_CancelMessageBox); + ScriptContext2_Enable(); + } + else if (input->pressedStartButton) + { + ScriptContext1_SetupScript(EventScript_CancelMessageBox); + ScriptContext2_Enable(); + } + } + } +} diff --git a/src/field_message_box.c b/src/field_message_box.c index 69d470b84e..9bb1bd52c4 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -5,8 +5,11 @@ #include "text.h" #include "match_call.h" #include "field_message_box.h" +#include "text_window.h" +#include "script.h" static EWRAM_DATA u8 sFieldMessageBoxMode = 0; +EWRAM_DATA u8 gWalkAwayFromSignInhibitTimer = 0; static void ExpandStringAndStartDrawFieldMessage(const u8*, bool32); static void StartDrawFieldMessage(void); @@ -29,7 +32,12 @@ static void Task_DrawFieldMessage(u8 taskId) switch (task->tState) { case 0: - LoadMessageBoxAndBorderGfx(); + if (IsMsgSignPost()) + LoadSignPostWindowFrameGfx(); + else + LoadMessageBoxAndBorderGfx(); + task->tState++; + break; task->tState++; break; case 1: diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 2a9304a4d8..4656e94b0f 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -39,7 +39,7 @@ static const u8 sTileBitAttributes[] = [MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_STAIRS_OUTSIDE_ABANDONED_SHIP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE), [MB_SHOAL_CAVE_ENTRANCE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - [MB_UNUSED_1D] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + [MB_SIGNPOST] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_UNUSED_1E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_UNUSED_1F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_ICE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE), @@ -1495,3 +1495,9 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) else return FALSE; } + +bool8 MetatileBehavior_IsSignpost(u8 mb) +{ + return (mb == MB_SIGNPOST); +} + diff --git a/src/overworld.c b/src/overworld.c index 9d5e40fb37..7082eb078c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1422,6 +1422,7 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys) UpdatePlayerAvatarTransitionState(); FieldClearPlayerInput(&inputStruct); FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); + FieldInput_HandleCancelSignpost(&inputStruct); if (!ScriptContext2_IsEnabled()) { if (ProcessPlayerFieldInput(&inputStruct) == 1) diff --git a/src/scrcmd.c b/src/scrcmd.c index 7dc02b6a8f..710a58c246 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1248,6 +1248,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); + ClearMsgBoxCancelableState(); return FALSE; } @@ -1262,6 +1263,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); + ClearMsgBoxCancelableState(); return FALSE; } diff --git a/src/script.c b/src/script.c index 726c065439..977298f833 100644 --- a/src/script.c +++ b/src/script.c @@ -3,6 +3,7 @@ #include "event_data.h" #include "mevent.h" #include "util.h" +#include "field_message_box.h" #include "constants/map_scripts.h" #define RAM_SCRIPT_MAGIC 51 @@ -19,6 +20,8 @@ static u8 sScriptContext1Status; static struct ScriptContext sScriptContext1; static struct ScriptContext sScriptContext2; static bool8 sScriptContext2Enabled; +static u8 sMsgIsSignPost; +static u8 sMsgBoxIsCancelable; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; @@ -444,3 +447,35 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) scriptSize = sizeof(gSaveBlock1Ptr->ramScript.data.script); InitRamScript(script, scriptSize, 0xFF, 0xFF, 0xFF); } + +// auto read signposts +void SetWalkingIntoSignVars(void) +{ + gWalkAwayFromSignInhibitTimer = 6; + sMsgBoxIsCancelable = TRUE; +} + +bool32 IsMsgSignPost(void) +{ + return sMsgIsSignPost; +} + +void ResetFacingNpcOrSignPostVars(void) +{ + sMsgIsSignPost = FALSE; +} + +void MsgSetSignPost(void) +{ + sMsgIsSignPost = TRUE; +} + +void ClearMsgBoxCancelableState(void) +{ + sMsgBoxIsCancelable = FALSE; +} + +bool32 CanWalkAwayToCancelMsgBox(void) +{ + return sMsgBoxIsCancelable; +} diff --git a/src/text_window.c b/src/text_window.c index 864bd08316..7d59ce2d35 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -5,6 +5,7 @@ #include "palette.h" #include "bg.h" #include "graphics.h" +#include "menu.h" // const rom data const u8 gTextWindowFrame1_Gfx[] = INCBIN_U8("graphics/text_window/1.4bpp"); @@ -195,3 +196,11 @@ void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset) LoadBgTiles(bg, sWindowFrames[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset); LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, 0x20); } + +void LoadSignPostWindowFrameGfx(void) +{ + // TODO signpost msgbox frames + //LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8470B0C, 0x260, destOffset); + //LoadPalette(GetWindowFrameTilesPal(1), palIdx, 32); + LoadMessageBoxAndBorderGfx(); +} From 7bb81150999f6585e3e6eeb8c4bc22c42e27893f Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 3 Mar 2023 09:08:05 -0500 Subject: [PATCH 002/225] add start menu funcs, credit deokishisu --- data/event_scripts.s | 1 + data/specials.inc | 1 + src/field_control_avatar.c | 12 ++++++++++++ src/field_specials.c | 7 +++++++ 4 files changed, 21 insertions(+) diff --git a/data/event_scripts.s b/data/event_scripts.s index 886c55f71c..3d2a9b2a81 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -691,6 +691,7 @@ EventScript_BackupMrBrineyLocation:: @ 8271E95 .include "data/scripts/set_gym_trainers.inc" EventScript_CancelMessageBox:: + special DoPicboxCancel release end diff --git a/data/specials.inc b/data/specials.inc index 620fae369b..9c23506d20 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -535,3 +535,4 @@ gSpecials:: @ 81DBA64 def_special RemoveRecordsWindow def_special CloseDeptStoreElevatorWindow def_special TrySetBattleTowerLinkType + def_special DoPicboxCancel diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 16e334f429..6547855610 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1103,6 +1103,16 @@ static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) return EventScript_TestSignpostMsg; } +static void Task_OpenStartMenu(u8 taskId) +{ + if (!ArePlayerFieldControlsLocked()) + { + PlaySE(SE_WIN_OPEN); + ShowStartMenu(); + DestroyTask(taskId); + } +} + void FieldInput_HandleCancelSignpost(struct FieldInput *input) { if (ScriptContext1_IsScriptSetUp() == TRUE) @@ -1123,6 +1133,8 @@ void FieldInput_HandleCancelSignpost(struct FieldInput *input) { ScriptContext1_SetupScript(EventScript_CancelMessageBox); ScriptContext2_Enable(); + if (!FuncIsActiveTask(Task_OpenStartMenu)) + CreateTask(Task_OpenStartMenu, 8); } } } diff --git a/src/field_specials.c b/src/field_specials.c index 86be21edac..93e5c0d1c1 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -4376,3 +4376,10 @@ u8 Script_TryGainNewFanFromCounter(void) { return TryGainNewFanFromCounter(gSpecialVar_0x8004); } + +void DoPicboxCancel(void) +{ + u8 t = EOS; + AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL); + ScriptMenu_HidePokemonPic(); +} From b43e0e07f73f57c143e0935d0d06f1b469383307 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 15 Jul 2024 21:45:34 -0700 Subject: [PATCH 003/225] Add config to disable OW_AUTO_SIGNPOST --- include/config/overworld.h | 1 + include/constants/metatile_behaviors.h | 4 ++++ src/metatile_behavior.c | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/include/config/overworld.h b/include/config/overworld.h index b666426996..8d9a46e0b8 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,6 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. +#define OW_AUTO_SIGNPOST FALSE // When the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpoost. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 05ee34110d..56df442bb8 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -30,7 +30,11 @@ #define MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2 0x1A #define MB_STAIRS_OUTSIDE_ABANDONED_SHIP 0x1B #define MB_SHOAL_CAVE_ENTRANCE 0x1C +#if OW_AUTO_SIGNPOST == TRUE #define MB_SIGNPOST 0x1D +#else +#define MB_UNUSED_1D 0x1D +#endif #define MB_UNUSED_1E 0x1E #define MB_UNUSED_1F 0x1F #define MB_ICE 0x20 diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index e8abdf5fd8..e5c72b127c 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -125,7 +125,9 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, [MB_VERTICAL_RAIL] = TILE_FLAG_UNUSED, [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, +#if OW_AUTO_SIGNPOST == TRUE [MB_SIGNPOST] = TILE_FLAG_UNUSED, +#endif }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) @@ -1404,6 +1406,10 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) bool8 MetatileBehavior_IsSignpost(u8 mb) { +#if OW_AUTO_SIGNPOST == TRUE return (mb == MB_SIGNPOST); +#else + return FALSE; +#endif } From 8445d44fb6b628d0fb1c812e0250eeac6a87005a Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 15 Jul 2024 21:48:24 -0700 Subject: [PATCH 004/225] Renamed DoPicboxCancel to UseBlankMessageToCancelPokemonPic --- data/event_scripts.s | 2 +- data/specials.inc | 2 +- include/config/overworld.h | 2 +- src/field_specials.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 1778472823..2d1b0d1bea 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -694,7 +694,7 @@ EventScript_BackupMrBrineyLocation:: .include "data/scripts/set_gym_trainers.inc" EventScript_CancelMessageBox:: - special DoPicboxCancel + special UseBlankMessageToCancelPokemonPic release end diff --git a/data/specials.inc b/data/specials.inc index 2779b1fe0c..044d794bc8 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -554,4 +554,4 @@ gSpecials:: def_special Script_GetChosenMonDefensiveEVs def_special Script_GetChosenMonOffensiveIVs def_special Script_GetChosenMonDefensiveIVs - def_special DoPicboxCancel + def_special UseBlankMessageToCancelPokemonPic diff --git a/include/config/overworld.h b/include/config/overworld.h index 8d9a46e0b8..412ced44e6 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,7 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. -#define OW_AUTO_SIGNPOST FALSE // When the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpoost. +#define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpost. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. diff --git a/src/field_specials.c b/src/field_specials.c index d247a4da80..e37a61f4df 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -4267,7 +4267,7 @@ void PreparePartyForSkyBattle(void) CompactPartySlots(); } -void DoPicboxCancel(void) +void UseBlankMessageToCancelPokemonPic(void) { u8 t = EOS; AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL); From b54cf221d8098cc0a1d53ec5adb867db7d324cd3 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 15 Jul 2024 22:13:33 -0700 Subject: [PATCH 005/225] Renamed and refactored FieldInput_HandleCancelSignpost into CancelSignPostMessageBox --- include/config/overworld.h | 2 +- include/event_scripts.h | 7 ++-- include/field_control_avatar.h | 2 +- src/field_control_avatar.c | 59 ++++++++++++++++++++-------------- src/overworld.c | 2 +- 5 files changed, 41 insertions(+), 31 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index 412ced44e6..aeaf88be58 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,7 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. -#define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpost. +#define OW_AUTO_SIGNPOST TRUE // When enabled, if the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpost. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. diff --git a/include/event_scripts.h b/include/event_scripts.h index 7b7ce54e67..f66e52866d 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -28,6 +28,9 @@ extern const u8 EventScript_FollowerFaceUp[]; extern const u8 EventScript_FollowerFaceResult[]; extern const u8 EnterPokeballMovement[]; +extern const u8 Common_Movement_FollowerSafeStart[]; +extern const u8 Common_Movement_FollowerSafeEnd[]; + extern const u8 EventScript_TestSignpostMsg[]; extern const u8 EventScript_TryGetTrainerScript[]; extern const u8 EventScript_StartTrainerApproach[]; @@ -643,10 +646,6 @@ extern const u8 VSSeeker_Text_BatteryNotChargedNeedXSteps[]; extern const u8 VSSeeker_Text_NoTrainersWithinRange[]; extern const u8 VSSeeker_Text_TrainersNotReady[]; extern const u8 EventScript_VsSeekerChargingDone[]; - -extern const u8 Common_Movement_FollowerSafeStart[]; -extern const u8 Common_Movement_FollowerSafeEnd[]; - extern const u8 EventScript_CancelMessageBox[]; #endif // GUARD_EVENT_SCRIPTS_H diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h index 994b4b6712..cbee293a31 100644 --- a/include/field_control_avatar.h +++ b/include/field_control_avatar.h @@ -34,6 +34,6 @@ u8 TrySetDiveWarp(void); const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction); const u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position); void ClearPoisonStepCounter(void); -void FieldInput_HandleCancelSignpost(struct FieldInput *input); +void CancelSignPostMessageBox(struct FieldInput *input); #endif // GUARD_FIELDCONTROLAVATAR_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 044c1c1779..85bbb4cf2b 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1167,29 +1167,40 @@ static void Task_OpenStartMenu(u8 taskId) } } -void FieldInput_HandleCancelSignpost(struct FieldInput *input) +bool32 IsDpadPushedToTurnOrMovePlayer(struct FieldInput *input) { - if (ScriptContext_IsEnabled() == TRUE) - { - if (gWalkAwayFromSignInhibitTimer != 0) - { - gWalkAwayFromSignInhibitTimer--; - } - else if (CanWalkAwayToCancelMsgBox() == TRUE) - { - //ClearMsgBoxCancelableState(); - if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection) - { - ScriptContext_SetupScript(EventScript_CancelMessageBox); - LockPlayerFieldControls(); - } - else if (input->pressedStartButton) - { - ScriptContext_SetupScript(EventScript_CancelMessageBox); - LockPlayerFieldControls(); - if (!FuncIsActiveTask(Task_OpenStartMenu)) - CreateTask(Task_OpenStartMenu, 8); - } - } - } + return (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection); +} + +void CancelSignPostMessageBox(struct FieldInput *input) +{ + if (!ScriptContext_IsEnabled()) + return; + + if (gWalkAwayFromSignInhibitTimer) + { + gWalkAwayFromSignInhibitTimer--; + return; + } + + if (!CanWalkAwayToCancelMsgBox()) + return; + + if (IsDpadPushedToTurnOrMovePlayer(input)) + { + ScriptContext_SetupScript(EventScript_CancelMessageBox); + LockPlayerFieldControls(); + return; + } + + if (!input->pressedStartButton) + return; + + ScriptContext_SetupScript(EventScript_CancelMessageBox); + LockPlayerFieldControls(); + + if (FuncIsActiveTask(Task_OpenStartMenu)) + return; + + CreateTask(Task_OpenStartMenu, 8); } diff --git a/src/overworld.c b/src/overworld.c index 2d787b3cea..866ba27e8e 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1489,7 +1489,7 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys) UpdatePlayerAvatarTransitionState(); FieldClearPlayerInput(&inputStruct); FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); - FieldInput_HandleCancelSignpost(&inputStruct); + CancelSignPostMessageBox(&inputStruct); if (!ArePlayerFieldControlsLocked()) { if (ProcessPlayerFieldInput(&inputStruct) == 1) From 1ae615651d38513ea90953a6cad857f7bb898cdc Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 15 Jul 2024 22:33:31 -0700 Subject: [PATCH 006/225] Renamed gWalkAwayFromSignInhibitTimer to gWalkAwayFromSignpostTimer --- include/field_message_box.h | 2 +- src/field_control_avatar.c | 4 ++-- src/field_message_box.c | 2 +- src/script.c | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/field_message_box.h b/include/field_message_box.h index eed6c7a9c0..810ac0fc20 100644 --- a/include/field_message_box.h +++ b/include/field_message_box.h @@ -19,6 +19,6 @@ u8 GetFieldMessageBoxMode(void); void StopFieldMessage(void); void InitFieldMessageBox(void); -extern u8 gWalkAwayFromSignInhibitTimer; +extern u8 gWalkAwayFromSignpostTimer; #endif // GUARD_FIELD_MESSAGE_BOX_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 85bbb4cf2b..3c8e7a206e 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1177,9 +1177,9 @@ void CancelSignPostMessageBox(struct FieldInput *input) if (!ScriptContext_IsEnabled()) return; - if (gWalkAwayFromSignInhibitTimer) + if (gWalkAwayFromSignpostTimer) { - gWalkAwayFromSignInhibitTimer--; + gWalkAwayFromSignpostTimer--; return; } diff --git a/src/field_message_box.c b/src/field_message_box.c index 730c569416..9d07ce24dc 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -9,7 +9,7 @@ #include "script.h" static EWRAM_DATA u8 sFieldMessageBoxMode = 0; -EWRAM_DATA u8 gWalkAwayFromSignInhibitTimer = 0; +EWRAM_DATA u8 gWalkAwayFromSignpostTimer = 0; static void ExpandStringAndStartDrawFieldMessage(const u8 *, bool32); static void StartDrawFieldMessage(void); diff --git a/src/script.c b/src/script.c index 03ce886364..6188b5070c 100644 --- a/src/script.c +++ b/src/script.c @@ -505,10 +505,11 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) #endif //FREE_MYSTERY_EVENT_BUFFERS } -// auto read signposts +#define WALK_AWAY_SIGNPOST_FRAMES 6 + void SetWalkingIntoSignVars(void) { - gWalkAwayFromSignInhibitTimer = 6; + gWalkAwayFromSignpostTimer = 6; sMsgBoxIsCancelable = TRUE; } From 61eff23d8965d228ebf62e36b9b100e151900812 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 15 Jul 2024 22:57:29 -0700 Subject: [PATCH 007/225] Moved menu defines to header file Added FRLG signpost border Started working on LoadSignPostWindowFrameGfx --- graphics/text_window/signpost.png | Bin 0 -> 219 bytes include/menu.h | 7 +++++++ src/menu.c | 6 ------ src/script.c | 2 +- src/text_window.c | 8 ++++---- 5 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 graphics/text_window/signpost.png diff --git a/graphics/text_window/signpost.png b/graphics/text_window/signpost.png new file mode 100644 index 0000000000000000000000000000000000000000..a37c7d17c4a73d12d8b5394dea0950293ea801fd GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!VDxQHLDu~DT4r?5ZB_fOaA}=pOlnz_3GJY z9321m7Awr*nDT9kVbIwnN5283&YryoM9;o~7+J;DcCYzn0QIJMx;TbtOiWHtVEpjk zol*Wk)BlSMAs={z8aV$sirMfB+kDUa{w~yEL-qIF<{SsF?=Ej-34edj+=Nw->Hq%# zwIA~%9P4tLBIdHNM9A=o9O>a=W7C<~ru9Q!twU9D0cV}UjAIuV7%py!nV|a3jvZ(t NgQu&X%Q~loCIEb?Sgim6 literal 0 HcmV?d00001 diff --git a/include/menu.h b/include/menu.h index fac4ef1b65..42bd69d45c 100644 --- a/include/menu.h +++ b/include/menu.h @@ -5,6 +5,13 @@ #include "text.h" #include "window.h" +#define DLG_WINDOW_PALETTE_NUM 15 +#define DLG_WINDOW_BASE_TILE_NUM 0x200 +#define STD_WINDOW_PALETTE_NUM 14 +#define STD_WINDOW_PALETTE_SIZE PLTT_SIZEOF(10) +#define STD_WINDOW_BASE_TILE_NUM 0x214 + + #define MENU_NOTHING_CHOSEN -2 #define MENU_B_PRESSED -1 diff --git a/src/menu.c b/src/menu.c index ff1970c3f1..1012a6b290 100644 --- a/src/menu.c +++ b/src/menu.c @@ -23,12 +23,6 @@ #include "config/overworld.h" #include "constants/songs.h" -#define DLG_WINDOW_PALETTE_NUM 15 -#define DLG_WINDOW_BASE_TILE_NUM 0x200 -#define STD_WINDOW_PALETTE_NUM 14 -#define STD_WINDOW_PALETTE_SIZE PLTT_SIZEOF(10) -#define STD_WINDOW_BASE_TILE_NUM 0x214 - struct MenuInfoIcon { u8 width; diff --git a/src/script.c b/src/script.c index 6188b5070c..98d679cd9f 100644 --- a/src/script.c +++ b/src/script.c @@ -509,7 +509,7 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) void SetWalkingIntoSignVars(void) { - gWalkAwayFromSignpostTimer = 6; + gWalkAwayFromSignpostTimer = WALK_AWAY_SIGNPOST_FRAMES; sMsgBoxIsCancelable = TRUE; } diff --git a/src/text_window.c b/src/text_window.c index d1e604d343..3cc3f7d47b 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -82,6 +82,8 @@ static const struct TilesPal sWindowFrames[WINDOW_FRAMES_COUNT] = {sTextWindowFrame20_Gfx, sTextWindowFrame20_Pal} }; +const u16 gSignpostWindow_Gfx[] = INCBIN_U16("graphics/text_window/signpost.4bpp"); + // code const struct TilesPal *GetWindowFrameTilesPal(u8 id) { @@ -199,8 +201,6 @@ void LoadUserWindowBorderGfxOnBg(u8 bg, u16 destOffset, u8 palOffset) void LoadSignPostWindowFrameGfx(void) { - // TODO signpost msgbox frames - //LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8470B0C, 0x260, destOffset); - //LoadPalette(GetWindowFrameTilesPal(1), palIdx, 32); - LoadMessageBoxAndBorderGfx(); + LoadBgTiles(GetWindowAttribute(0, WINDOW_BG), gSignpostWindow_Gfx, 0x260, DLG_WINDOW_BASE_TILE_NUM); + LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM), PLTT_SIZE_4BPP); } From a0c5e5511c0aae9a5a8374c98c6fbf5b4d65d99f Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Wed, 24 Jul 2024 19:41:36 -0700 Subject: [PATCH 008/225] Added gSignPostWindow_Gfx Added LoadSignBoxGfx Add LoadSignPostWindowFrameGfx --- graphics/text_window/signpost.bin | Bin 0 -> 1200 bytes graphics/text_window/signpost.png | Bin 219 -> 164 bytes include/graphics.h | 3 ++- include/text_window.h | 1 + src/field_message_box.c | 2 +- src/graphics.c | 1 + src/menu.c | 6 ++++++ src/text_window.c | 13 ++++++------- 8 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 graphics/text_window/signpost.bin diff --git a/graphics/text_window/signpost.bin b/graphics/text_window/signpost.bin new file mode 100644 index 0000000000000000000000000000000000000000..6358e199db9cfc27b69dbb01b2c4b385350aee9b GIT binary patch literal 1200 zcmeH@u?+wq48xK%pbq{2Ubvx5NVR7#28KB>2VM^lLNt_VV_`R3zI@m+mC;beI-pJj AfdBvi literal 0 HcmV?d00001 diff --git a/graphics/text_window/signpost.png b/graphics/text_window/signpost.png index a37c7d17c4a73d12d8b5394dea0950293ea801fd..89e667df9265b6bd81c68962a043a68db42b2997 100644 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^7C_9w!VDziE-5wuDT4r?5ZC_<|AFA#xqI2g)j%#)z4*}Q$iB}UTi1x literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!VDxQHLDu~DT4r?5ZB_fOaA}=pOlnz_3GJY z9321m7Awr*nDT9kVbIwnN5283&YryoM9;o~7+J;DcCYzn0QIJMx;TbtOiWHtVEpjk zol*Wk)BlSMAs={z8aV$sirMfB+kDUa{w~yEL-qIF<{SsF?=Ej-34edj+=Nw->Hq%# zwIA~%9P4tLBIdHNM9A=o9O>a=W7C<~ru9Q!twU9D0cV}UjAIuV7%py!nV|a3jvZ(t NgQu&X%Q~loCIEb?Sgim6 diff --git a/include/graphics.h b/include/graphics.h index fc60c29ebf..2da00d9804 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2,8 +2,9 @@ #define GUARD_GRAPHICS_H // overworld -extern const u32 gMessageBox_Gfx[]; extern const u16 gMessageBox_Pal[]; +extern const u32 gMessageBox_Gfx[]; +extern const u32 gSignpostWindow_Gfx[]; // pokeballs extern const u32 gBallGfx_Poke[]; diff --git a/include/text_window.h b/include/text_window.h index 4e26c70a90..a292d1309e 100644 --- a/include/text_window.h +++ b/include/text_window.h @@ -14,6 +14,7 @@ extern const u16 gTextWindowFrame1_Pal[]; const struct TilesPal *GetWindowFrameTilesPal(u8 id); void LoadMessageBoxGfx(u8 windowId, u16 destOffset, u8 palOffset); +void LoadSignBoxGfx(u8 windowId, u16 destOffset, u8 palOffset); void LoadWindowGfx(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset); void LoadUserWindowBorderGfx(u8 windowId, u16 destOffset, u8 palOffset); void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset); diff --git a/src/field_message_box.c b/src/field_message_box.c index 9d07ce24dc..4f50699a6a 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -41,7 +41,7 @@ static void Task_DrawFieldMessage(u8 taskId) task->tState++; break; case 1: - DrawDialogueFrame(0, TRUE); + DrawDialogueFrame(0, TRUE); task->tState++; break; case 2: diff --git a/src/graphics.c b/src/graphics.c index 58c629fbc9..4efd17db09 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1984,6 +1984,7 @@ const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.b const u16 gMessageBox_Pal[] = INCBIN_U16("graphics/text_window/message_box.gbapal"); const u8 gMessageBox_Gfx[] = INCBIN_U8("graphics/text_window/message_box.4bpp"); +const u8 gSignpostWindow_Gfx[] = INCBIN_U8("graphics/text_window/signpost.4bpp"); const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.lz"); const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.lz"); diff --git a/src/menu.c b/src/menu.c index 1012a6b290..ecb8dd20d6 100644 --- a/src/menu.c +++ b/src/menu.c @@ -214,6 +214,12 @@ void LoadMessageBoxAndBorderGfx(void) LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); } +void LoadSignPostWindowFrameGfx(void) +{ + LoadSignBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); + //LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); +} + void DrawDialogueFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame); diff --git a/src/text_window.c b/src/text_window.c index 3cc3f7d47b..6423867205 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -82,8 +82,6 @@ static const struct TilesPal sWindowFrames[WINDOW_FRAMES_COUNT] = {sTextWindowFrame20_Gfx, sTextWindowFrame20_Pal} }; -const u16 gSignpostWindow_Gfx[] = INCBIN_U16("graphics/text_window/signpost.4bpp"); - // code const struct TilesPal *GetWindowFrameTilesPal(u8 id) { @@ -99,6 +97,12 @@ void LoadMessageBoxGfx(u8 windowId, u16 destOffset, u8 palOffset) LoadPalette(GetOverworldTextboxPalettePtr(), palOffset, PLTT_SIZE_4BPP); } +void LoadSignBoxGfx(u8 windowId, u16 destOffset, u8 palOffset) +{ + LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gSignpostWindow_Gfx, 0x1C0, destOffset); + LoadPalette(GetOverworldTextboxPalettePtr(), palOffset, PLTT_SIZE_4BPP); +} + void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset) { LoadUserWindowBorderGfx(windowId, destOffset, palOffset); @@ -199,8 +203,3 @@ void LoadUserWindowBorderGfxOnBg(u8 bg, u16 destOffset, u8 palOffset) LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, PLTT_SIZE_4BPP); } -void LoadSignPostWindowFrameGfx(void) -{ - LoadBgTiles(GetWindowAttribute(0, WINDOW_BG), gSignpostWindow_Gfx, 0x260, DLG_WINDOW_BASE_TILE_NUM); - LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM), PLTT_SIZE_4BPP); -} From 389f4e4180a1960c19cca9679a48bf34b42e3942 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Wed, 24 Jul 2024 20:58:18 -0700 Subject: [PATCH 009/225] Worked with ShinyDragonHunter to get signpost working --- graphics/text_window/signpost.png | Bin 164 -> 193 bytes src/menu.c | 126 +++++++++++++++++++++++++++++- src/text_window.c | 2 +- 3 files changed, 125 insertions(+), 3 deletions(-) diff --git a/graphics/text_window/signpost.png b/graphics/text_window/signpost.png index 89e667df9265b6bd81c68962a043a68db42b2997..45ab7c6764b4561cf091f05101e60c4c242c35db 100644 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj!!VDxUYZhbxDT4r?5ZB_fOaA}=pOlnz_3GJY z9321m7Awr*nDT9kVbIwnN5283&YryoM9;o~7+J;DcCYzn0QGVfctjR6Fz_7#VaBQ2 ze9}Ncb59q?5RRG22@OpD{_ig5W@2PEauEH)&uHK%AiaWV^@I0!6&QqBHXck%6urao iU* literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^7C_9w!VDziE-5wuDT4r?5ZC_<|AFA#xqI2g)j%#)z4*}Q$iB}UTi1x diff --git a/src/menu.c b/src/menu.c index ecb8dd20d6..6cb9c05492 100644 --- a/src/menu.c +++ b/src/menu.c @@ -17,6 +17,7 @@ #include "sound.h" #include "string_util.h" #include "strings.h" +#include "script.h" #include "task.h" #include "text_window.h" #include "window.h" @@ -48,6 +49,7 @@ struct Menu static u16 AddWindowParameterized(u8, u8, u8, u8, u8, u8, u16); static void WindowFunc_DrawStandardFrame(u8, u8, u8, u8, u8, u8); +static void WindowFunc_DrawSignFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_DrawDialogueFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_ClearStdWindowAndFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_ClearDialogWindowAndFrame(u8, u8, u8, u8, u8, u8); @@ -216,13 +218,133 @@ void LoadMessageBoxAndBorderGfx(void) void LoadSignPostWindowFrameGfx(void) { + Menu_LoadStdPal(); LoadSignBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); - //LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); + LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); +} + +static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + // Top left + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 0, + tilemapLeft - 2, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 1, + tilemapLeft - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 2, + tilemapLeft - 2, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 3, + tilemapLeft - 1, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + + // Bottom left + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), + tilemapLeft - 2, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), + tilemapLeft - 1, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + + // Top + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 4, + tilemapLeft, + tilemapTop - 1, + 26, + 1, + DLG_WINDOW_PALETTE_NUM); + + // Top right + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), + tilemapLeft + 27, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), + tilemapLeft + 26, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), + tilemapLeft + 27, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), + tilemapLeft + 26, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + + // Bottom right + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0)), + tilemapLeft + 27, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1)), + tilemapLeft + 26, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + + // Bottom + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), + tilemapLeft, + tilemapTop + 4, + 26, + 1, + DLG_WINDOW_PALETTE_NUM); +} + +static inline void *GetWindowFunc_DialogueFrame(void) +{ + return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); + } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) { - CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame); + CallWindowFunction(windowId, GetWindowFunc_DialogueFrame()); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); PutWindowTilemap(windowId); if (copyToVram == TRUE) diff --git a/src/text_window.c b/src/text_window.c index 6423867205..6c02797fe3 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -100,7 +100,7 @@ void LoadMessageBoxGfx(u8 windowId, u16 destOffset, u8 palOffset) void LoadSignBoxGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gSignpostWindow_Gfx, 0x1C0, destOffset); - LoadPalette(GetOverworldTextboxPalettePtr(), palOffset, PLTT_SIZE_4BPP); + LoadPalette(GetTextWindowPalette(1), palOffset, PLTT_SIZE_4BPP); } void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset) From 614b7f862e1a9b4fd7bef09c9ecc412e2438265d Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Wed, 24 Jul 2024 22:21:00 -0700 Subject: [PATCH 010/225] Working version of interactable signpost msgbox --- src/field_control_avatar.c | 16 ++++++++++++++-- src/menu.c | 12 +----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 3c8e7a206e..df77f798ce 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -82,6 +82,7 @@ static void UpdateLetsGoEvolutionTracker(void); static bool8 UpdatePoisonStepCounter(void); #endif // OW_POISON_DAMAGE static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static void SetMsgSignPostAndVarFacing(u32 playerDirection); static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position); @@ -379,6 +380,9 @@ static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position if (bgEvent->bgUnion.script == NULL) return EventScript_TestSignpostMsg; + if (GetFacingSignpostType(metatileBehavior, direction) != SIGNPOST_NA) + SetMsgSignPostAndVarFacing(direction); + switch (bgEvent->kind) { case BG_EVENT_PLAYER_FACING_ANY: @@ -1133,18 +1137,26 @@ static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE) return SIGNPOST_POKEMART;*/ + DebugPrintf("behavior is %d",metatileBehavior); + if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) return SIGNPOST_SCRIPTED; return SIGNPOST_NA; } +static void SetMsgSignPostAndVarFacing(u32 playerDirection) +{ + DebugPrintf("test"); + MsgSetSignPost(); + gSpecialVar_Facing = playerDirection; +} + static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) { - gSpecialVar_Facing = playerDirection; ScriptContext_SetupScript(script); SetWalkingIntoSignVars(); - MsgSetSignPost(); + SetMsgSignPostAndVarFacing(playerDirection); } static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) diff --git a/src/menu.c b/src/menu.c index 6cb9c05492..620c4d13e1 100644 --- a/src/menu.c +++ b/src/menu.c @@ -225,7 +225,6 @@ void LoadSignPostWindowFrameGfx(void) static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { - // Top left FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, @@ -254,8 +253,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi 1, 4, DLG_WINDOW_PALETTE_NUM); - - // Bottom left FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, @@ -270,8 +267,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi 1, 1, DLG_WINDOW_PALETTE_NUM); - - // Top FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft, @@ -279,8 +274,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi 26, 1, DLG_WINDOW_PALETTE_NUM); - - // Top right FillBgTilemapBufferRect(bg, BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft + 27, @@ -309,8 +302,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi 1, 4, DLG_WINDOW_PALETTE_NUM); - - // Bottom right FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0)), tilemapLeft + 27, @@ -325,8 +316,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi 1, 1, DLG_WINDOW_PALETTE_NUM); - - // Bottom FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft, @@ -338,6 +327,7 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi static inline void *GetWindowFunc_DialogueFrame(void) { + DebugPrintf("test %d",IsMsgSignPost()); return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); } From fd69ef339c5ea1578e52f22cc51ff338cb77abb1 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 19:33:07 -0700 Subject: [PATCH 011/225] Got pokemart and pokecenter changes working --- include/constants/metatile_behaviors.h | 4 +++- include/event_scripts.h | 3 +++ include/metatile_behavior.h | 2 ++ src/field_control_avatar.c | 18 +++++++----------- src/menu.c | 1 - src/metatile_behavior.c | 18 ++++++++++++++++++ 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 56df442bb8..808fa49df7 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -32,11 +32,13 @@ #define MB_SHOAL_CAVE_ENTRANCE 0x1C #if OW_AUTO_SIGNPOST == TRUE #define MB_SIGNPOST 0x1D +#define MB_SIGNPOST_POKECENTER 0x1E +#define MB_SIGNPOST_POKEMART 0x1F #else #define MB_UNUSED_1D 0x1D -#endif #define MB_UNUSED_1E 0x1E #define MB_UNUSED_1F 0x1F +#endif #define MB_ICE 0x20 #define MB_SAND 0x21 #define MB_SEAWEED 0x22 diff --git a/include/event_scripts.h b/include/event_scripts.h index f66e52866d..f23f52cb12 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -648,4 +648,7 @@ extern const u8 VSSeeker_Text_TrainersNotReady[]; extern const u8 EventScript_VsSeekerChargingDone[]; extern const u8 EventScript_CancelMessageBox[]; +extern const u8 Common_EventScript_ShowPokemonCenterSign[]; +extern const u8 Common_EventScript_ShowPokemartSign[]; + #endif // GUARD_EVENT_SCRIPTS_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index 74f0beca74..0c4622adaf 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -149,5 +149,7 @@ bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); bool8 MetatileBehavior_IsSignpost(u8 mb); +bool8 MetatileBehavior_IsPokemonCenterSign(u8 mb); +bool8 MetatileBehavior_IsPokeMartSign(u8 mb); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index df77f798ce..880eb8d59e 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1112,13 +1112,12 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 me switch (GetFacingSignpostType(metatileBehavior, playerDirection)) { - /* leaving this commented out for examples of custom signpost types case SIGNPOST_POKECENTER: - SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection); + SetUpWalkIntoSignScript(Common_EventScript_ShowPokemonCenterSign, playerDirection); return TRUE; case SIGNPOST_POKEMART: - SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection); - return TRUE;*/ + SetUpWalkIntoSignScript(Common_EventScript_ShowPokemartSign, playerDirection); + return TRUE; case SIGNPOST_SCRIPTED: script = GetSignpostScriptAtMapPosition(position); if (script == NULL) @@ -1132,12 +1131,10 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 me static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) { - /*if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, playerDirection) == TRUE) + if (MetatileBehavior_IsPokemonCenterSign(metatileBehavior) == TRUE) return SIGNPOST_POKECENTER; - if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE) - return SIGNPOST_POKEMART;*/ - - DebugPrintf("behavior is %d",metatileBehavior); + if (MetatileBehavior_IsPokeMartSign(metatileBehavior) == TRUE) + return SIGNPOST_POKEMART; if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) return SIGNPOST_SCRIPTED; @@ -1147,7 +1144,7 @@ static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) static void SetMsgSignPostAndVarFacing(u32 playerDirection) { - DebugPrintf("test"); + SetWalkingIntoSignVars(); MsgSetSignPost(); gSpecialVar_Facing = playerDirection; } @@ -1155,7 +1152,6 @@ static void SetMsgSignPostAndVarFacing(u32 playerDirection) static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) { ScriptContext_SetupScript(script); - SetWalkingIntoSignVars(); SetMsgSignPostAndVarFacing(playerDirection); } diff --git a/src/menu.c b/src/menu.c index 620c4d13e1..2679e0a336 100644 --- a/src/menu.c +++ b/src/menu.c @@ -327,7 +327,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi static inline void *GetWindowFunc_DialogueFrame(void) { - DebugPrintf("test %d",IsMsgSignPost()); return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); } diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index e5c72b127c..601e2660af 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1413,3 +1413,21 @@ bool8 MetatileBehavior_IsSignpost(u8 mb) #endif } +bool8 MetatileBehavior_IsPokemonCenterSign(u8 mb) +{ +#if OW_AUTO_SIGNPOST == TRUE + return (mb == MB_SIGNPOST_POKECENTER); +#else + return FALSE; +#endif +} + +bool8 MetatileBehavior_IsPokeMartSign(u8 mb) +{ +#if OW_AUTO_SIGNPOST == TRUE + return (mb == MB_SIGNPOST_POKEMART); +#else + return FALSE; +#endif +} + From b5c58e53de13ccf5d1142638f0320d9bec88153a Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 19:35:28 -0700 Subject: [PATCH 012/225] Removed all comments --- include/script.h | 1 - src/field_control_avatar.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/include/script.h b/include/script.h index eba18ec35f..48d1f6c0ec 100644 --- a/include/script.h +++ b/include/script.h @@ -63,7 +63,6 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize); // srccmd.h void SetMovingNpcId(u16 npcId); -// auto read signs void SetWalkingIntoSignVars(void); void MsgSetSignPost(void); void ResetFacingNpcOrSignPostVars(void); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 880eb8d59e..049305db86 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1099,8 +1099,6 @@ int SetCableClubWarp(void) return 0; } -// auto read signposts -// signposts static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 metatileBehavior, u8 playerDirection) { const u8 *script; From c6f89d199667cf9cf1ac877964fa81395ac5649b Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 19:36:33 -0700 Subject: [PATCH 013/225] Removed swap file --- .swp | Bin 4096 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .swp diff --git a/.swp b/.swp deleted file mode 100644 index 5e1b894bdd178ae6540706061764e60b34548a85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmYc?2=nw+u+%eP00IFJ0Rc=L3=9RuX)rEc+Ql{4JH$Ug*U};^%+=Hkui8<`(GVC7 zfq@DE&QN0`LvU7CR#H?D7786Ghm6`g8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFaRL{ E06$R)(EtDd From 2a5f384e6688acaac4ea3d0db464eface40f86da Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 19:44:26 -0700 Subject: [PATCH 014/225] Added metatile behaviors to mart and center signs --- .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes include/constants/metatile_behaviors.h | 4 ++-- src/metatile_behavior.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index af9326451d561c4103afe500c5ae8c7656092fc6..95b03cbdffe43d189b8b49eadb9fb2e9b8c1db62 100644 GIT binary patch delta 21 ccmZqRXyBO8!YnT!Ke64GSx!K1<8e!706 Date: Thu, 25 Jul 2024 20:23:04 -0700 Subject: [PATCH 015/225] Revert metatile behavior --- .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index 95b03cbdffe43d189b8b49eadb9fb2e9b8c1db62..d9cd29016d792fb568494dbf2f820100081a14f8 100644 GIT binary patch delta 35 jcmZqRXy9OHfPjhY`iu+{&3%~}1Q;f^+k&W#$1RxwUG4@X delta 35 ncmZqRXy9OH00Y^H?D~wd6U}{@ Date: Thu, 25 Jul 2024 20:34:14 -0700 Subject: [PATCH 016/225] Clean up files --- include/config/overworld.h | 2 +- include/event_scripts.h | 1 - include/graphics.h | 4 ++-- include/menu.h | 1 - include/metatile_behavior.h | 6 +++--- src/field_control_avatar.c | 20 ++++++++------------ src/metatile_behavior.c | 6 +++--- 7 files changed, 17 insertions(+), 23 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index aeaf88be58..292743a211 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,7 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. -#define OW_AUTO_SIGNPOST TRUE // When enabled, if the tile that the player is facing has MB_SIGNPOST, the player will automatically read the signpost. +#define OW_AUTO_SIGNPOST TRUE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. diff --git a/include/event_scripts.h b/include/event_scripts.h index f23f52cb12..7ec15d4548 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -647,7 +647,6 @@ extern const u8 VSSeeker_Text_NoTrainersWithinRange[]; extern const u8 VSSeeker_Text_TrainersNotReady[]; extern const u8 EventScript_VsSeekerChargingDone[]; extern const u8 EventScript_CancelMessageBox[]; - extern const u8 Common_EventScript_ShowPokemonCenterSign[]; extern const u8 Common_EventScript_ShowPokemartSign[]; diff --git a/include/graphics.h b/include/graphics.h index 2da00d9804..e58ee7bf50 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2,9 +2,9 @@ #define GUARD_GRAPHICS_H // overworld -extern const u16 gMessageBox_Pal[]; -extern const u32 gMessageBox_Gfx[]; extern const u32 gSignpostWindow_Gfx[]; +extern const u32 gMessageBox_Gfx[]; +extern const u16 gMessageBox_Pal[]; // pokeballs extern const u32 gBallGfx_Poke[]; diff --git a/include/menu.h b/include/menu.h index 42bd69d45c..d2190fb854 100644 --- a/include/menu.h +++ b/include/menu.h @@ -11,7 +11,6 @@ #define STD_WINDOW_PALETTE_SIZE PLTT_SIZEOF(10) #define STD_WINDOW_BASE_TILE_NUM 0x214 - #define MENU_NOTHING_CHOSEN -2 #define MENU_B_PRESSED -1 diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index 0c4622adaf..d49dc2459a 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -148,8 +148,8 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); -bool8 MetatileBehavior_IsSignpost(u8 mb); -bool8 MetatileBehavior_IsPokemonCenterSign(u8 mb); -bool8 MetatileBehavior_IsPokeMartSign(u8 mb); +bool32 MetatileBehavior_IsSignpost(u32 mb); +bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb); +bool32 MetatileBehavior_IsPokeMartSign(u32 mb); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 049305db86..7972be7a11 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -35,6 +35,7 @@ #include "constants/event_objects.h" #include "constants/field_poison.h" #include "constants/map_types.h" +#include "constants/metatile_behaviors.h" #include "constants/songs.h" #include "constants/trainer_hill.h" @@ -43,12 +44,7 @@ static EWRAM_DATA u16 sPrevMetatileBehavior = 0; u8 gSelectedObjectEvent; -#define SIGNPOST_POKECENTER 0 -#define SIGNPOST_POKEMART 1 -#define SIGNPOST_INDIGO_1 2 -#define SIGNPOST_INDIGO_2 3 -#define SIGNPOST_SCRIPTED 240 -#define SIGNPOST_NA 255 +#define SIGNPOST_NA 0 static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); @@ -1110,13 +1106,13 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 me switch (GetFacingSignpostType(metatileBehavior, playerDirection)) { - case SIGNPOST_POKECENTER: + case MB_POKEMON_CENTER_SIGN: SetUpWalkIntoSignScript(Common_EventScript_ShowPokemonCenterSign, playerDirection); return TRUE; - case SIGNPOST_POKEMART: + case MB_POKEMART_SIGN: SetUpWalkIntoSignScript(Common_EventScript_ShowPokemartSign, playerDirection); return TRUE; - case SIGNPOST_SCRIPTED: + case MB_SIGNPOST: script = GetSignpostScriptAtMapPosition(position); if (script == NULL) return FALSE; @@ -1130,12 +1126,12 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 me static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) { if (MetatileBehavior_IsPokemonCenterSign(metatileBehavior) == TRUE) - return SIGNPOST_POKECENTER; + return MB_POKEMON_CENTER_SIGN; if (MetatileBehavior_IsPokeMartSign(metatileBehavior) == TRUE) - return SIGNPOST_POKEMART; + return MB_POKEMART_SIGN; if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) - return SIGNPOST_SCRIPTED; + return MB_SIGNPOST; return SIGNPOST_NA; } diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 88bca9f0de..fcf8b64fd1 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1404,7 +1404,7 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsSignpost(u8 mb) +bool32 MetatileBehavior_IsSignpost(u32 mb) { #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_SIGNPOST); @@ -1413,7 +1413,7 @@ bool8 MetatileBehavior_IsSignpost(u8 mb) #endif } -bool8 MetatileBehavior_IsPokemonCenterSign(u8 mb) +bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb) { #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMON_CENTER_SIGN); @@ -1422,7 +1422,7 @@ bool8 MetatileBehavior_IsPokemonCenterSign(u8 mb) #endif } -bool8 MetatileBehavior_IsPokeMartSign(u8 mb) +bool32 MetatileBehavior_IsPokeMartSign(u32 mb) { #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMART_SIGN); From 02cdbb3c7daeee4e1843adf2b39abf790a97e9ab Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 21:07:11 -0700 Subject: [PATCH 017/225] Cleaned up field_control_avatar --- log2.txt | 0 src/field_control_avatar.c | 54 +++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 27 deletions(-) delete mode 100644 log2.txt diff --git a/log2.txt b/log2.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 7972be7a11..85e9f2cfb4 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -44,7 +44,7 @@ static EWRAM_DATA u16 sPrevMetatileBehavior = 0; u8 gSelectedObjectEvent; -#define SIGNPOST_NA 0 +#define NOT_SIGNPOST 0 static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); @@ -77,10 +77,10 @@ static void UpdateLetsGoEvolutionTracker(void); #if OW_POISON_DAMAGE < GEN_5 static bool8 UpdatePoisonStepCounter(void); #endif // OW_POISON_DAMAGE -static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static bool32 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u32 metatileBehavior, u32 playerDirection); static void SetMsgSignPostAndVarFacing(u32 playerDirection); -static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); -static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); +static void SetUpWalkIntoSignScript(const u8 *script, u32 playerDirection); +static u32 GetFacingSignpostType(u16 metatileBehvaior, u32 direction); static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position); void FieldClearPlayerInput(struct FieldInput *input) @@ -183,18 +183,18 @@ int ProcessPlayerFieldInput(struct FieldInput *input) return TRUE; } - if (input->checkStandardWildEncounter) - { - if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) - { - GetInFrontOfPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) - return TRUE; - GetPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - } - } + if (input->checkStandardWildEncounter) + { + if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } + } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; @@ -376,7 +376,7 @@ static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position if (bgEvent->bgUnion.script == NULL) return EventScript_TestSignpostMsg; - if (GetFacingSignpostType(metatileBehavior, direction) != SIGNPOST_NA) + if (GetFacingSignpostType(metatileBehavior, direction) != NOT_SIGNPOST) SetMsgSignPostAndVarFacing(direction); switch (bgEvent->kind) @@ -1095,7 +1095,7 @@ int SetCableClubWarp(void) return 0; } -static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 metatileBehavior, u8 playerDirection) +static bool32 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u32 metatileBehavior, u32 playerDirection) { const u8 *script; @@ -1123,7 +1123,7 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u16 me } } -static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) +static u32 GetFacingSignpostType(u16 metatileBehavior, u32 playerDirection) { if (MetatileBehavior_IsPokemonCenterSign(metatileBehavior) == TRUE) return MB_POKEMON_CENTER_SIGN; @@ -1133,7 +1133,7 @@ static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) return MB_SIGNPOST; - return SIGNPOST_NA; + return NOT_SIGNPOST; } static void SetMsgSignPostAndVarFacing(u32 playerDirection) @@ -1143,7 +1143,7 @@ static void SetMsgSignPostAndVarFacing(u32 playerDirection) gSpecialVar_Facing = playerDirection; } -static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) +static void SetUpWalkIntoSignScript(const u8 *script, u32 playerDirection) { ScriptContext_SetupScript(script); SetMsgSignPostAndVarFacing(playerDirection); @@ -1161,12 +1161,12 @@ static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) static void Task_OpenStartMenu(u8 taskId) { - if (!ArePlayerFieldControlsLocked()) - { - PlaySE(SE_WIN_OPEN); - ShowStartMenu(); - DestroyTask(taskId); - } + if (ArePlayerFieldControlsLocked()) + return; + + PlaySE(SE_WIN_OPEN); + ShowStartMenu(); + DestroyTask(taskId); } bool32 IsDpadPushedToTurnOrMovePlayer(struct FieldInput *input) From f362f6e754c52ebd6e9c8f6e15ae376f3bd9884a Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Thu, 25 Jul 2024 21:22:08 -0700 Subject: [PATCH 018/225] Cleaned up metatile behavior --- src/menu.c | 2 +- src/metatile_behavior.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/menu.c b/src/menu.c index 2679e0a336..c58f72f3e5 100644 --- a/src/menu.c +++ b/src/menu.c @@ -50,6 +50,7 @@ struct Menu static u16 AddWindowParameterized(u8, u8, u8, u8, u8, u8, u16); static void WindowFunc_DrawStandardFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_DrawSignFrame(u8, u8, u8, u8, u8, u8); +static inline void *GetWindowFunc_DialogueFrame(void); static void WindowFunc_DrawDialogueFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_ClearStdWindowAndFrame(u8, u8, u8, u8, u8, u8); static void WindowFunc_ClearDialogWindowAndFrame(u8, u8, u8, u8, u8, u8); @@ -328,7 +329,6 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi static inline void *GetWindowFunc_DialogueFrame(void) { return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); - } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index fcf8b64fd1..1212457d24 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -127,6 +127,8 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, #if OW_AUTO_SIGNPOST == TRUE [MB_SIGNPOST] = TILE_FLAG_UNUSED, + [MB_POKEMON_CENTER_SIGN] = TILE_FLAG_UNUSED, + [MB_POKEMART_SIGN] = TILE_FLAG_UNUSED, #endif }; From 59c2eeac215a8748933815d2248c064428def099 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Fri, 26 Jul 2024 21:22:29 -0700 Subject: [PATCH 019/225] Default signpost config is off --- include/config/overworld.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index 292743a211..c740bf4853 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,7 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. -#define OW_AUTO_SIGNPOST TRUE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost. +#define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. From 587ffeeb97a53b8ae1123d46690e45af503c37b9 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Fri, 26 Jul 2024 21:31:04 -0700 Subject: [PATCH 020/225] Fixed tabs --- src/field_control_avatar.c | 86 ++++++++-------- src/field_message_box.c | 2 +- src/menu.c | 200 ++++++++++++++++++------------------- src/metatile_behavior.c | 6 +- 4 files changed, 147 insertions(+), 147 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 85e9f2cfb4..92e9df1c54 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -183,18 +183,18 @@ int ProcessPlayerFieldInput(struct FieldInput *input) return TRUE; } - if (input->checkStandardWildEncounter) - { - if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) - { - GetInFrontOfPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) - return TRUE; - GetPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - } - } + if (input->checkStandardWildEncounter) + { + if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } + } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; @@ -376,8 +376,8 @@ static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position if (bgEvent->bgUnion.script == NULL) return EventScript_TestSignpostMsg; - if (GetFacingSignpostType(metatileBehavior, direction) != NOT_SIGNPOST) - SetMsgSignPostAndVarFacing(direction); + if (GetFacingSignpostType(metatileBehavior, direction) != NOT_SIGNPOST) + SetMsgSignPostAndVarFacing(direction); switch (bgEvent->kind) { @@ -1146,7 +1146,7 @@ static void SetMsgSignPostAndVarFacing(u32 playerDirection) static void SetUpWalkIntoSignScript(const u8 *script, u32 playerDirection) { ScriptContext_SetupScript(script); - SetMsgSignPostAndVarFacing(playerDirection); + SetMsgSignPostAndVarFacing(playerDirection); } static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) @@ -1161,48 +1161,48 @@ static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition *position) static void Task_OpenStartMenu(u8 taskId) { - if (ArePlayerFieldControlsLocked()) - return; + if (ArePlayerFieldControlsLocked()) + return; - PlaySE(SE_WIN_OPEN); - ShowStartMenu(); - DestroyTask(taskId); + PlaySE(SE_WIN_OPEN); + ShowStartMenu(); + DestroyTask(taskId); } bool32 IsDpadPushedToTurnOrMovePlayer(struct FieldInput *input) { - return (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection); + return (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection); } void CancelSignPostMessageBox(struct FieldInput *input) { - if (!ScriptContext_IsEnabled()) - return; + if (!ScriptContext_IsEnabled()) + return; - if (gWalkAwayFromSignpostTimer) - { - gWalkAwayFromSignpostTimer--; - return; - } + if (gWalkAwayFromSignpostTimer) + { + gWalkAwayFromSignpostTimer--; + return; + } - if (!CanWalkAwayToCancelMsgBox()) - return; + if (!CanWalkAwayToCancelMsgBox()) + return; - if (IsDpadPushedToTurnOrMovePlayer(input)) - { - ScriptContext_SetupScript(EventScript_CancelMessageBox); - LockPlayerFieldControls(); - return; - } + if (IsDpadPushedToTurnOrMovePlayer(input)) + { + ScriptContext_SetupScript(EventScript_CancelMessageBox); + LockPlayerFieldControls(); + return; + } - if (!input->pressedStartButton) - return; + if (!input->pressedStartButton) + return; - ScriptContext_SetupScript(EventScript_CancelMessageBox); - LockPlayerFieldControls(); + ScriptContext_SetupScript(EventScript_CancelMessageBox); + LockPlayerFieldControls(); - if (FuncIsActiveTask(Task_OpenStartMenu)) - return; + if (FuncIsActiveTask(Task_OpenStartMenu)) + return; - CreateTask(Task_OpenStartMenu, 8); + CreateTask(Task_OpenStartMenu, 8); } diff --git a/src/field_message_box.c b/src/field_message_box.c index 4f50699a6a..9d07ce24dc 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -41,7 +41,7 @@ static void Task_DrawFieldMessage(u8 taskId) task->tState++; break; case 1: - DrawDialogueFrame(0, TRUE); + DrawDialogueFrame(0, TRUE); task->tState++; break; case 2: diff --git a/src/menu.c b/src/menu.c index c58f72f3e5..441c80250e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -219,116 +219,116 @@ void LoadMessageBoxAndBorderGfx(void) void LoadSignPostWindowFrameGfx(void) { - Menu_LoadStdPal(); + Menu_LoadStdPal(); LoadSignBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM)); LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM)); } static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) { - FillBgTilemapBufferRect(bg, - DLG_WINDOW_BASE_TILE_NUM + 0, - tilemapLeft - 2, - tilemapTop - 1, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - DLG_WINDOW_BASE_TILE_NUM + 1, - tilemapLeft - 1, - tilemapTop - 1, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - DLG_WINDOW_BASE_TILE_NUM + 2, - tilemapLeft - 2, - tilemapTop, - 1, - 4, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - DLG_WINDOW_BASE_TILE_NUM + 3, - tilemapLeft - 1, - tilemapTop, - 1, - 4, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), - tilemapLeft - 2, - tilemapTop + 4, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), - tilemapLeft - 1, - tilemapTop + 4, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - DLG_WINDOW_BASE_TILE_NUM + 4, - tilemapLeft, - tilemapTop - 1, - 26, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), - tilemapLeft + 27, - tilemapTop - 1, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), - tilemapLeft + 26, - tilemapTop - 1, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), - tilemapLeft + 27, - tilemapTop, - 1, - 4, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), - tilemapLeft + 26, - tilemapTop, - 1, - 4, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0)), - tilemapLeft + 27, - tilemapTop + 4, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1)), - tilemapLeft + 26, - tilemapTop + 4, - 1, - 1, - DLG_WINDOW_PALETTE_NUM); - FillBgTilemapBufferRect(bg, - BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), - tilemapLeft, - tilemapTop + 4, - 26, - 1, - DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 0, + tilemapLeft - 2, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 1, + tilemapLeft - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 2, + tilemapLeft - 2, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 3, + tilemapLeft - 1, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), + tilemapLeft - 2, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), + tilemapLeft - 1, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 4, + tilemapLeft, + tilemapTop - 1, + 26, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), + tilemapLeft + 27, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), + tilemapLeft + 26, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), + tilemapLeft + 27, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), + tilemapLeft + 26, + tilemapTop, + 1, + 4, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0)), + tilemapLeft + 27, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(BG_TILE_H_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1)), + tilemapLeft + 26, + tilemapTop + 4, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), + tilemapLeft, + tilemapTop + 4, + 26, + 1, + DLG_WINDOW_PALETTE_NUM); } static inline void *GetWindowFunc_DialogueFrame(void) { - return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); + return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 1212457d24..fc7e3a9326 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1411,7 +1411,7 @@ bool32 MetatileBehavior_IsSignpost(u32 mb) #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_SIGNPOST); #else - return FALSE; + return FALSE; #endif } @@ -1420,7 +1420,7 @@ bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb) #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMON_CENTER_SIGN); #else - return FALSE; + return FALSE; #endif } @@ -1429,7 +1429,7 @@ bool32 MetatileBehavior_IsPokeMartSign(u32 mb) #if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMART_SIGN); #else - return FALSE; + return FALSE; #endif } From 31fc49734a1770d4c27f10efebb58069a15fb23b Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 07:34:33 -0700 Subject: [PATCH 021/225] Removed preproc from src/metatile_behavior.c per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1693914236 --- src/metatile_behavior.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index fc7e3a9326..d16194ec2b 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1408,28 +1408,17 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) bool32 MetatileBehavior_IsSignpost(u32 mb) { -#if OW_AUTO_SIGNPOST == TRUE return (mb == MB_SIGNPOST); -#else - return FALSE; -#endif } bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb) { -#if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMON_CENTER_SIGN); -#else - return FALSE; -#endif } bool32 MetatileBehavior_IsPokeMartSign(u32 mb) { -#if OW_AUTO_SIGNPOST == TRUE return (mb == MB_POKEMART_SIGN); -#else - return FALSE; #endif } From 1ad3ba1f329604bf575f3c99f13ccfca812c62d3 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 10:58:51 -0700 Subject: [PATCH 022/225] Fixed compilations errors with abgcc --- include/constants/metatile_behaviors.h | 6 ------ src/metatile_behavior.c | 1 - 2 files changed, 7 deletions(-) diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 7f2bb9df78..780e452531 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -30,15 +30,9 @@ #define MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2 0x1A #define MB_STAIRS_OUTSIDE_ABANDONED_SHIP 0x1B #define MB_SHOAL_CAVE_ENTRANCE 0x1C -#if OW_AUTO_SIGNPOST == TRUE #define MB_SIGNPOST 0x1D #define MB_POKEMON_CENTER_SIGN 0x1E #define MB_POKEMART_SIGN 0x1F -#else -#define MB_UNUSED_1D 0x1D -#define MB_UNUSED_1E 0x1E -#define MB_UNUSED_1F 0x1F -#endif #define MB_ICE 0x20 #define MB_SAND 0x21 #define MB_SEAWEED 0x22 diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index d16194ec2b..eb602b9d22 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1419,6 +1419,5 @@ bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb) bool32 MetatileBehavior_IsPokeMartSign(u32 mb) { return (mb == MB_POKEMART_SIGN); -#endif } From 0a997fa6ca84dbb2c810eb5bcc08f3adcdeb9259 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 14:57:53 -0700 Subject: [PATCH 023/225] Moved follower scripts back to original position https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003538 --- include/event_scripts.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/event_scripts.h b/include/event_scripts.h index 7ec15d4548..2923ae9331 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -28,9 +28,6 @@ extern const u8 EventScript_FollowerFaceUp[]; extern const u8 EventScript_FollowerFaceResult[]; extern const u8 EnterPokeballMovement[]; -extern const u8 Common_Movement_FollowerSafeStart[]; -extern const u8 Common_Movement_FollowerSafeEnd[]; - extern const u8 EventScript_TestSignpostMsg[]; extern const u8 EventScript_TryGetTrainerScript[]; extern const u8 EventScript_StartTrainerApproach[]; @@ -646,6 +643,10 @@ extern const u8 VSSeeker_Text_BatteryNotChargedNeedXSteps[]; extern const u8 VSSeeker_Text_NoTrainersWithinRange[]; extern const u8 VSSeeker_Text_TrainersNotReady[]; extern const u8 EventScript_VsSeekerChargingDone[]; + +extern const u8 Common_Movement_FollowerSafeStart[]; +extern const u8 Common_Movement_FollowerSafeEnd[]; + extern const u8 EventScript_CancelMessageBox[]; extern const u8 Common_EventScript_ShowPokemonCenterSign[]; extern const u8 Common_EventScript_ShowPokemartSign[]; From d21d23b52ccd50f1961ebe0ac3c5299692da69cb Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 14:59:36 -0700 Subject: [PATCH 024/225] Removed extra spaces per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003572 --- src/field_control_avatar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 92e9df1c54..aaeb2a6b14 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -44,7 +44,7 @@ static EWRAM_DATA u16 sPrevMetatileBehavior = 0; u8 gSelectedObjectEvent; -#define NOT_SIGNPOST 0 +#define NOT_SIGNPOST 0 static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); From b66678248364f134e32f07b7608d816c57f0e4cb Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:01:33 -0700 Subject: [PATCH 025/225] Nested conditions per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003628 --- src/field_control_avatar.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index aaeb2a6b14..244b3d2de8 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -207,9 +207,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) GetInFrontOfPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (input->heldDirection && input->dpadDirection == playerDirection) - { - if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + if (input->heldDirection && (input->dpadDirection == playerDirection) && if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)) return TRUE; } From e360d3bd73184725c66c674648a3734ed2a4f1cf Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:02:15 -0700 Subject: [PATCH 026/225] Removed extra newline per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003683 --- src/field_control_avatar.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 244b3d2de8..b6d9298c47 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1127,7 +1127,6 @@ static u32 GetFacingSignpostType(u16 metatileBehavior, u32 playerDirection) return MB_POKEMON_CENTER_SIGN; if (MetatileBehavior_IsPokeMartSign(metatileBehavior) == TRUE) return MB_POKEMART_SIGN; - if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) return MB_SIGNPOST; From 3c4aaf53f8442adc7aa4240abd6f213d12026f0e Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:03:03 -0700 Subject: [PATCH 027/225] Removed unneeded preproc per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003941 --- src/metatile_behavior.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index eb602b9d22..8b8c4898f5 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -125,11 +125,9 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, [MB_VERTICAL_RAIL] = TILE_FLAG_UNUSED, [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED, -#if OW_AUTO_SIGNPOST == TRUE [MB_SIGNPOST] = TILE_FLAG_UNUSED, [MB_POKEMON_CENTER_SIGN] = TILE_FLAG_UNUSED, [MB_POKEMART_SIGN] = TILE_FLAG_UNUSED, -#endif }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) From fccecf038f697f80efb74040e22b8afd5c350410 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:03:45 -0700 Subject: [PATCH 028/225] Removed extra newline per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694003876 --- src/metatile_behavior.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 8b8c4898f5..903b0a64eb 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1418,4 +1418,3 @@ bool32 MetatileBehavior_IsPokeMartSign(u32 mb) { return (mb == MB_POKEMART_SIGN); } - From 4f03ba98bebf4b04908927e82dc0dcc84e5f133d Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:05:49 -0700 Subject: [PATCH 029/225] Removed extra newline per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044/files\#r1694004015 --- src/text_window.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/text_window.c b/src/text_window.c index 6c02797fe3..efd087977e 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -202,4 +202,3 @@ void LoadUserWindowBorderGfxOnBg(u8 bg, u16 destOffset, u8 palOffset) LoadBgTiles(bg, sWindowFrames[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset); LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, PLTT_SIZE_4BPP); } - From 5bb1730394b81b6e63faa7ad3f6015fd9535080d Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:07:50 -0700 Subject: [PATCH 030/225] Fixed if statement compilation --- src/field_control_avatar.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index b6d9298c47..1699a6daa2 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -207,9 +207,8 @@ int ProcessPlayerFieldInput(struct FieldInput *input) GetInFrontOfPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (input->heldDirection && (input->dpadDirection == playerDirection) && if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)) + if (input->heldDirection && (input->dpadDirection == playerDirection) && (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)) return TRUE; - } if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; From 1ac4d195c22070f5026e72727788dac4e18cb53e Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:17:32 -0700 Subject: [PATCH 031/225] Changed mb to MetatileBehavior per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1694003941 --- src/metatile_behavior.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 903b0a64eb..8923e633da 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1404,17 +1404,17 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) return FALSE; } -bool32 MetatileBehavior_IsSignpost(u32 mb) +bool32 MetatileBehavior_IsSignpost(u32 metatileBehavior) { - return (mb == MB_SIGNPOST); + return (metatileBehavior == MB_SIGNPOST); } -bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb) +bool32 MetatileBehavior_IsPokemonCenterSign(u32 metatileBehavior) { - return (mb == MB_POKEMON_CENTER_SIGN); + return (metatileBehavior == MB_POKEMON_CENTER_SIGN); } -bool32 MetatileBehavior_IsPokeMartSign(u32 mb) +bool32 MetatileBehavior_IsPokeMartSign(u32 metatileBehavior) { - return (mb == MB_POKEMART_SIGN); + return (metatileBehavior == MB_POKEMART_SIGN); } From fb53297e644a069065b433d343724df4553a3d9d Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:45:48 -0700 Subject: [PATCH 032/225] Added documentation around OW_AUTO_SIGNPOST --- include/config/overworld.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index c740bf4853..0dd9afda76 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -3,7 +3,7 @@ // Movement config #define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors. -#define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost. +#define OW_AUTO_SIGNPOST FALSE // When enabled, if the tile that the player is facing has MB_SIGNPOST, MB_POKEMART_SIGN, or MB_POKEMON_CENTER_SIGN, the player will automatically read the signpost, as seen in FRLG. // Other settings #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. From 91255a6054cd3b1127e17b5f2f1e03dcab366b43 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 27 Jul 2024 15:49:22 -0700 Subject: [PATCH 033/225] Removed mb labels --- include/metatile_behavior.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index d49dc2459a..5bb95bc18e 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -148,8 +148,8 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); -bool32 MetatileBehavior_IsSignpost(u32 mb); -bool32 MetatileBehavior_IsPokemonCenterSign(u32 mb); -bool32 MetatileBehavior_IsPokeMartSign(u32 mb); +bool32 MetatileBehavior_IsSignpost(u32); +bool32 MetatileBehavior_IsPokemonCenterSign(u32); +bool32 MetatileBehavior_IsPokeMartSign(u32); #endif // GUARD_METATILE_BEHAVIOR_H From 62b4ea5aaad856f7aa43235bcd1384d70f68eb2e Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 1 Aug 2024 13:18:29 -0400 Subject: [PATCH 034/225] Fixed bottom half of Mt. Pyre not being labeled in PokeNav --- src/landmark.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/landmark.c b/src/landmark.c index 615a9bfe3e..d2bb3c4105 100644 --- a/src/landmark.c +++ b/src/landmark.c @@ -369,8 +369,13 @@ static const struct LandmarkList sLandmarkLists[] = {MAPSEC_ROUTE_120, 2, Landmarks_Route120_2}, {MAPSEC_ROUTE_121, 2, Landmarks_Route121_2}, {MAPSEC_ROUTE_122, 0, Landmarks_Route122_0}, +#ifdef BUGFIX + {MAPSEC_ROUTE_122, 1, Landmarks_Route122_0}, + {MAPSEC_ROUTE_123, 0, Landmarks_Route123_0}, +#else {MAPSEC_ROUTE_123, 0, Landmarks_Route123_0}, {MAPSEC_ROUTE_122, 1, Landmarks_Route122_0}, +#endif {MAPSEC_ROUTE_124, 7, Landmarks_Route124_7}, {MAPSEC_ROUTE_125, 2, Landmarks_Route125_2}, {MAPSEC_ROUTE_128, 1, Landmarks_Route128_1}, From 41a79e3833ebef1809f63f5c45223ad104a7655b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 3 Aug 2024 23:23:34 +0200 Subject: [PATCH 035/225] IsValidForBattle function formatting (#5085) ocd --- src/battle_controllers.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 230c3464dd..fae42939d0 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -610,9 +610,10 @@ static void InitLinkBtlControllers(void) bool32 IsValidForBattle(struct Pokemon *mon) { u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); - return (species != SPECIES_NONE && species != SPECIES_EGG - && GetMonData(mon, MON_DATA_HP) != 0 - && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); + return (species != SPECIES_NONE + && species != SPECIES_EGG + && GetMonData(mon, MON_DATA_HP) != 0 + && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); } static void SetBattlePartyIds(void) From 0fb48e8a9a92e17a885cb08e8c6389b2f34c442e Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sat, 3 Aug 2024 17:00:28 -0700 Subject: [PATCH 036/225] Fixed expanded OW IDs --- include/battle_tower.h | 4 ++-- src/battle_tower.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/battle_tower.h b/include/battle_tower.h index 8288ffb7ea..710d05b00c 100644 --- a/include/battle_tower.h +++ b/include/battle_tower.h @@ -34,9 +34,9 @@ struct FacilityMon }; extern const u8 gTowerMaleFacilityClasses[30]; -extern const u8 gTowerMaleTrainerGfxIds[30]; +extern const u16 gTowerMaleTrainerGfxIds[30]; extern const u8 gTowerFemaleFacilityClasses[20]; -extern const u8 gTowerFemaleTrainerGfxIds[20]; +extern const u16 gTowerFemaleTrainerGfxIds[20]; extern const u16 gBattleFrontierHeldItems[]; extern const struct FacilityMon gBattleFrontierMons[]; extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; diff --git a/src/battle_tower.c b/src/battle_tower.c index 91db376e53..42f9801651 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -208,7 +208,7 @@ const u8 gTowerFemaleFacilityClasses[20] = FACILITY_CLASS_LASS }; -const u8 gTowerMaleTrainerGfxIds[30] = +const u16 gTowerMaleTrainerGfxIds[30] = { OBJ_EVENT_GFX_HIKER, OBJ_EVENT_GFX_TUBER_M, @@ -242,7 +242,7 @@ const u8 gTowerMaleTrainerGfxIds[30] = OBJ_EVENT_GFX_HIKER }; -const u8 gTowerFemaleTrainerGfxIds[20] = +const u16 gTowerFemaleTrainerGfxIds[20] = { OBJ_EVENT_GFX_WOMAN_2, OBJ_EVENT_GFX_TUBER_F, @@ -3469,7 +3469,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) u16 FacilityClassToGraphicsId(u8 facilityClass) { - u8 trainerObjectGfxId; + u16 trainerObjectGfxId; u8 i; // Search male classes. From 369efc12083b596662ab08141588ee0bc8de39bd Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 4 Aug 2024 01:15:36 +0100 Subject: [PATCH 037/225] Fix two small text errors in follower dialogue --- src/data/text/follower_messages.h | 2 +- src/follower_helper.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/text/follower_messages.h b/src/data/text/follower_messages.h index 7678992f22..1564d0ad7b 100644 --- a/src/data/text/follower_messages.h +++ b/src/data/text/follower_messages.h @@ -134,7 +134,7 @@ const struct FollowerMsgInfo gFollowerUpsetMessages[] = { // Unconditional angry messages static const u8 sAngryMsg00[] = _("{STR_VAR_1} let out a roar!"); -static const u8 sAngryMsg01[] = _("{STR_VAR_1} is making a face like\nits angry!"); +static const u8 sAngryMsg01[] = _("{STR_VAR_1} is making a face like\nit's angry!"); static const u8 sAngryMsg02[] = _("{STR_VAR_1} seems to be angry for\nsome reason."); static const u8 sAngryMsg03[] = _("Your POKéMON turned to face the\nother way, showing a defiant face."); static const u8 sAngryMsg04[] = _("{STR_VAR_1} cried out."); diff --git a/src/follower_helper.c b/src/follower_helper.c index b2f44e7d1a..be52877c5f 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -54,7 +54,7 @@ static const u8* const sFearTexts[] = {sCondMsg29, sCondMsg30, NULL}; static const u8 sCondMsg31[] = _("{STR_VAR_1} is taking shelter in the\ngrass from the rain."); static const u8 sCondMsg32[] = _("{STR_VAR_1} seems very cold."); static const u8 sCondMsg33[] = _("{STR_VAR_1} is staring at the sea."); -static const u8 sCondMsg34[] = _("Your pokemon is staring intently at\nthe sea!"); +static const u8 sCondMsg34[] = _("Your POKéMON is staring intently at\nthe sea!"); static const u8 sCondMsg35[] = _("{STR_VAR_1} is looking at the\nsurging sea."); static const u8* const sSeaTexts[] = {sCondMsg33, sCondMsg34, sCondMsg35, NULL}; static const u8 sCondMsg36[] = _("{STR_VAR_1} is listening to the\nsound of the waterfall."); From 4dce7db714ebe759b18fd04d9e2af6a2a2a9544f Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 4 Aug 2024 16:53:46 +0100 Subject: [PATCH 038/225] Another text fix --- src/data/text/follower_messages.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/follower_messages.h b/src/data/text/follower_messages.h index 1564d0ad7b..638df64d88 100644 --- a/src/data/text/follower_messages.h +++ b/src/data/text/follower_messages.h @@ -34,7 +34,7 @@ static const u8 sHappyMsg11[] = _("Your POKéMON has caught the scent of\nsmoke. static const u8 sHappyMsg12[] = _("{STR_VAR_1} is poking at your belly."); static const u8 sHappyMsg13[] = _("Your POKéMON stretched out its body\nand is relaxing."); static const u8 sHappyMsg14[] = _("{STR_VAR_1} looks like it wants to\nlead!"); -static const u8 sHappyMsg15[] = _("{STR_VAR_1} is doing it's best to\nkeep up with you."); +static const u8 sHappyMsg15[] = _("{STR_VAR_1} is doing its best to\nkeep up with you."); static const u8 sHappyMsg16[] = _("{STR_VAR_1} is happily cuddling up\nto you!"); static const u8 sHappyMsg17[] = _("{STR_VAR_1} is full of life!"); static const u8 sHappyMsg18[] = _("{STR_VAR_1} seems to be very happy!"); From 9ac8d0de25b6a1ca647bfcd4b911e375f6c2c704 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2024 03:41:55 +0200 Subject: [PATCH 039/225] Optimize/get rid of unused palette vars/functions (#4841) --- include/palette.h | 30 ++-- src/battle_anim_mons.c | 6 - src/fldeff_sweetscent.c | 5 +- src/palette.c | 325 +++++----------------------------------- src/scrcmd.c | 5 +- 5 files changed, 60 insertions(+), 311 deletions(-) diff --git a/include/palette.h b/include/palette.h index 15c92cc2a7..13c06b0078 100644 --- a/include/palette.h +++ b/include/palette.h @@ -54,33 +54,31 @@ struct PaletteFadeControl extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; -extern u8 ALIGNED(4) gPaletteDecompressionBuffer[]; extern u16 ALIGNED(4) gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; extern u16 ALIGNED(4) gPlttBufferFaded[PLTT_BUFFER_SIZE]; -void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); -void LoadPalette(const void *src, u16 offset, u16 size); -void FillPalette(u16 value, u16 offset, u16 size); +void LoadCompressedPalette(const u32 *src, u32 offset, u32 size); +void LoadPalette(const void *src, u32 offset, u32 size); +void FillPalette(u32 value, u32 offset, u32 size); void TransferPlttBuffer(void); -u8 UpdatePaletteFade(void); +u32 UpdatePaletteFade(void); void ResetPaletteFade(void); -bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor); -void PaletteStruct_ResetById(u16 id); +bool32 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u32 blendColor); void ResetPaletteFadeControl(void); void InvertPlttBuffer(u32 selectedPalettes); void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b); void UnfadePlttBuffer(u32 selectedPalettes); -void BeginFastPaletteFade(u8 submode); -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters); -void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); -void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color); +void BeginFastPaletteFade(u32 submode); +void BeginHardwarePaletteFade(u32 blendCnt, u32 delay, u32 y, u32 targetY, u32 shouldResetBlendRegisters); +void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color); +void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u32 color); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); -void TintPalette_GrayScale(u16 *palette, u16 count); -void TintPalette_GrayScale2(u16 *palette, u16 count); -void TintPalette_SepiaTone(u16 *palette, u16 count); -void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone); +void TintPalette_GrayScale(u16 *palette, u32 count); +void TintPalette_GrayScale2(u16 *palette, u32 count); +void TintPalette_SepiaTone(u16 *palette, u32 count); +void TintPalette_CustomTone(u16 *palette, u32 count, u16 rTone, u16 gTone, u16 bTone); -static inline void SetBackdropFromColor(u16 color) +static inline void SetBackdropFromColor(u32 color) { FillPalette(color, 0, PLTT_SIZEOF(1)); } diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 542a179d6a..73c1e99448 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -663,12 +663,6 @@ static void UNUSED TranslateSpriteToBattleAttackerPos(struct Sprite *sprite) #undef sStartY #undef sTargetY -static void UNUSED EndUnkPaletteAnim(struct Sprite *sprite) -{ - PaletteStruct_ResetById(sprite->data[5]); - DestroySpriteAndMatrix(sprite); -} - void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite) { if (sprite->affineAnimEnded) diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index a28b6fee61..a5b2740458 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -1,4 +1,5 @@ #include "global.h" +#include "decompress.h" #include "event_data.h" #include "event_scripts.h" #include "field_effect.h" @@ -52,7 +53,7 @@ void StartSweetScentFieldEffect(void) u32 palettes = ~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16) | (1 << 13) | (1 << 14) | (1 << 15)); PlaySE(SE_M_SWEET_SCENT); - CpuFastCopy(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); + CpuFastCopy(gPlttBufferUnfaded, gDecompressionBuffer, PLTT_SIZE); CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(palettes, 4, 0, 8, RGB_RED); taskId = CreateTask(TrySweetScentEncounter, 0); @@ -91,7 +92,7 @@ static void FailSweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { - CpuFastCopy(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); + CpuFastCopy(gDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); SetWeatherPalStateIdle(); ScriptContext_SetupScript(EventScript_FailSweetScent); DestroyTask(taskId); diff --git a/src/palette.c b/src/palette.c index fccff062a8..2526479ca8 100644 --- a/src/palette.c +++ b/src/palette.c @@ -13,62 +13,20 @@ enum HARDWARE_FADE, }; -// These are structs for some unused palette system. -// The full functionality of this system is unknown. - -#define NUM_PALETTE_STRUCTS 16 - -struct PaletteStructTemplate -{ - u16 id; - u16 *src; - bool16 pst_field_8_0:1; - u16 unused:9; - u16 size:5; - u8 time1; - u8 srcCount:5; - u8 state:3; - u8 time2; -}; - -struct PaletteStruct -{ - const struct PaletteStructTemplate *template; - bool32 active:1; - bool32 flag:1; - u32 baseDestOffset:9; - u32 destOffset:10; - u32 srcIndex:7; - u8 countdown1; - u8 countdown2; -}; - -static void PaletteStruct_Copy(struct PaletteStruct *, u32 *); -static void PaletteStruct_Blend(struct PaletteStruct *, u32 *); -static void PaletteStruct_TryEnd(struct PaletteStruct *); -static void PaletteStruct_Reset(u8); -static u8 PaletteStruct_GetPalNum(u16); -static u8 UpdateNormalPaletteFade(void); -static void BeginFastPaletteFadeInternal(u8); -static u8 UpdateFastPaletteFade(void); -static u8 UpdateHardwarePaletteFade(void); +static u32 UpdateNormalPaletteFade(void); +static void BeginFastPaletteFadeInternal(u32); +static u32 UpdateFastPaletteFade(void); +static u32 UpdateHardwarePaletteFade(void); static void UpdateBlendRegisters(void); -static bool8 IsSoftwarePaletteFadeFinishing(void); +static bool32 IsSoftwarePaletteFadeFinishing(void); static void Task_BlendPalettesGradually(u8 taskId); // palette buffers require alignment with agbcc because // unaligned word reads are issued in BlendPalette otherwise ALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0}; ALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0}; -static EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0}; EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; static EWRAM_DATA u32 sPlttBufferTransferPending = 0; -EWRAM_DATA u8 ALIGNED(2) gPaletteDecompressionBuffer[PLTT_SIZE] = {0}; - -static const struct PaletteStructTemplate sDummyPaletteStructTemplate = { - .id = 0xFFFF, - .state = 1 -}; static const u8 sRoundedDownGrayscaleMap[] = { 0, 0, 0, 0, 0, @@ -80,20 +38,20 @@ static const u8 sRoundedDownGrayscaleMap[] = { 31, 31 }; -void LoadCompressedPalette(const u32 *src, u16 offset, u16 size) +void LoadCompressedPalette(const u32 *src, u32 offset, u32 size) { - LZDecompressWram(src, gPaletteDecompressionBuffer); - CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferUnfaded[offset], size); - CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferFaded[offset], size); + LZDecompressWram(src, gDecompressionBuffer); + CpuCopy16(gDecompressionBuffer, &gPlttBufferUnfaded[offset], size); + CpuCopy16(gDecompressionBuffer, &gPlttBufferFaded[offset], size); } -void LoadPalette(const void *src, u16 offset, u16 size) +void LoadPalette(const void *src, u32 offset, u32 size) { CpuCopy16(src, &gPlttBufferUnfaded[offset], size); CpuCopy16(src, &gPlttBufferFaded[offset], size); } -void FillPalette(u16 value, u16 offset, u16 size) +void FillPalette(u32 value, u32 offset, u32 size) { CpuFill16(value, &gPlttBufferUnfaded[offset], size); CpuFill16(value, &gPlttBufferFaded[offset], size); @@ -112,10 +70,9 @@ void TransferPlttBuffer(void) } } -u8 UpdatePaletteFade(void) +u32 UpdatePaletteFade(void) { - u8 result; - u8 dummy = 0; + u32 result; if (sPlttBufferTransferPending) return PALETTE_FADE_STATUS_LOADING; @@ -127,37 +84,19 @@ u8 UpdatePaletteFade(void) else result = UpdateHardwarePaletteFade(); - sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; + sPlttBufferTransferPending = gPaletteFade.multipurpose1; return result; } void ResetPaletteFade(void) { - u8 i; - - for (i = 0; i < NUM_PALETTE_STRUCTS; i++) - PaletteStruct_Reset(i); - ResetPaletteFadeControl(); } -static void ReadPlttIntoBuffers(void) -{ - u16 i; - u16 *pltt = (u16 *)PLTT; - - for (i = 0; i < PLTT_BUFFER_SIZE; i++) - { - gPlttBufferUnfaded[i] = pltt[i]; - gPlttBufferFaded[i] = pltt[i]; - } -} - -bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) +bool32 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u32 blendColor) { u8 temp; - u16 color = blendColor; if (gPaletteFade.active) { @@ -178,7 +117,7 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe gPaletteFade_delay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; - gPaletteFade.blendColor = color; + gPaletteFade.blendColor = blendColor; gPaletteFade.active = TRUE; gPaletteFade.mode = NORMAL_FADE; @@ -200,165 +139,6 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe } } -static bool8 UNUSED BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor) -{ - ReadPlttIntoBuffers(); - return BeginNormalPaletteFade(selectedPalettes, delay, startY, targetY, blendColor); -} - -static void UNUSED PaletteStruct_Run(u8 a1, u32 *unkFlags) -{ - u8 i; - - for (i = 0; i < NUM_PALETTE_STRUCTS; i++) - { - struct PaletteStruct *palstruct = &sPaletteStructs[i]; - if (palstruct->active) - { - if (palstruct->template->pst_field_8_0 == a1) - { - if (palstruct->srcIndex == palstruct->template->srcCount) - { - PaletteStruct_TryEnd(palstruct); - if (!palstruct->active) - continue; - } - if (palstruct->countdown1 == 0) - PaletteStruct_Copy(palstruct, unkFlags); - else - palstruct->countdown1--; - - PaletteStruct_Blend(palstruct, unkFlags); - } - } - } -} - -static void PaletteStruct_Copy(struct PaletteStruct *palStruct, u32 *unkFlags) -{ - s32 srcIndex; - s32 srcCount; - u8 i = 0; - u16 srcOffset = palStruct->srcIndex * palStruct->template->size; - - if (!palStruct->template->pst_field_8_0) - { - while (i < palStruct->template->size) - { - gPlttBufferUnfaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; - gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; - i++; - palStruct->destOffset++; - srcOffset++; - } - } - else - { - while (i < palStruct->template->size) - { - gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset]; - i++; - palStruct->destOffset++; - srcOffset++; - } - } - - palStruct->destOffset = palStruct->baseDestOffset; - palStruct->countdown1 = palStruct->template->time1; - palStruct->srcIndex++; - - srcIndex = palStruct->srcIndex; - srcCount = palStruct->template->srcCount; - - if (srcIndex >= srcCount) - { - if (palStruct->countdown2) - palStruct->countdown2--; - palStruct->srcIndex = 0; - } - - *unkFlags |= 1 << (palStruct->baseDestOffset >> 4); -} - -static void PaletteStruct_Blend(struct PaletteStruct *palStruct, u32 *unkFlags) -{ - if (gPaletteFade.active && ((1 << (palStruct->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) - { - if (!palStruct->template->pst_field_8_0) - { - if (gPaletteFade.delayCounter != gPaletteFade_delay) - { - BlendPalette( - palStruct->baseDestOffset, - palStruct->template->size, - gPaletteFade.y, - gPaletteFade.blendColor); - } - } - else - { - if (!gPaletteFade.delayCounter) - { - if (palStruct->countdown1 != palStruct->template->time1) - { - u32 srcOffset = palStruct->srcIndex * palStruct->template->size; - u8 i; - - for (i = 0; i < palStruct->template->size; i++) - gPlttBufferFaded[palStruct->baseDestOffset + i] = palStruct->template->src[srcOffset + i]; - } - } - } - } -} - -static void PaletteStruct_TryEnd(struct PaletteStruct *pal) -{ - if (pal->countdown2 == 0) - { - s32 state = pal->template->state; - - if (state == 0) - { - pal->srcIndex = 0; - pal->countdown1 = pal->template->time1; - pal->countdown2 = pal->template->time2; - pal->destOffset = pal->baseDestOffset; - } - else - { - if (state < 0) - return; - if (state > 2) - return; - PaletteStruct_ResetById(pal->template->id); - } - } - else - { - pal->countdown2--; - } -} - -void PaletteStruct_ResetById(u16 id) -{ - u8 paletteNum = PaletteStruct_GetPalNum(id); - if (paletteNum != NUM_PALETTE_STRUCTS) - PaletteStruct_Reset(paletteNum); -} - -static void PaletteStruct_Reset(u8 paletteNum) -{ - sPaletteStructs[paletteNum].template = &sDummyPaletteStructTemplate; - sPaletteStructs[paletteNum].active = FALSE; - sPaletteStructs[paletteNum].baseDestOffset = 0; - sPaletteStructs[paletteNum].destOffset = 0; - sPaletteStructs[paletteNum].srcIndex = 0; - sPaletteStructs[paletteNum].flag = 0; - sPaletteStructs[paletteNum].countdown1 = 0; - sPaletteStructs[paletteNum].countdown2 = 0; -} - void ResetPaletteFadeControl(void) { gPaletteFade.multipurpose1 = 0; @@ -379,32 +159,7 @@ void ResetPaletteFadeControl(void) gPaletteFade.deltaY = 2; } -static void UNUSED PaletteStruct_SetUnusedFlag(u16 id) -{ - u8 paletteNum = PaletteStruct_GetPalNum(id); - if (paletteNum != NUM_PALETTE_STRUCTS) - sPaletteStructs[paletteNum].flag = TRUE; -} - -static void UNUSED PaletteStruct_ClearUnusedFlag(u16 id) -{ - u8 paletteNum = PaletteStruct_GetPalNum(id); - if (paletteNum != NUM_PALETTE_STRUCTS) - sPaletteStructs[paletteNum].flag = FALSE; -} - -static u8 PaletteStruct_GetPalNum(u16 id) -{ - u8 i; - - for (i = 0; i < NUM_PALETTE_STRUCTS; i++) - if (sPaletteStructs[i].template->id == id) - return i; - - return NUM_PALETTE_STRUCTS; -} - -static u8 UpdateNormalPaletteFade(void) +static u32 UpdateNormalPaletteFade(void) { u16 paletteOffset; u16 selectedPalettes; @@ -498,7 +253,7 @@ void InvertPlttBuffer(u32 selectedPalettes) { if (selectedPalettes & 1) { - u8 i; + u32 i; for (i = 0; i < 16; i++) gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; } @@ -515,7 +270,7 @@ void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) { if (selectedPalettes & 1) { - u8 i; + u32 i; for (i = 0; i < 16; i++) { struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; @@ -546,13 +301,13 @@ void UnfadePlttBuffer(u32 selectedPalettes) } } -void BeginFastPaletteFade(u8 submode) +void BeginFastPaletteFade(u32 submode) { gPaletteFade.deltaY = 2; BeginFastPaletteFadeInternal(submode); } -static void BeginFastPaletteFadeInternal(u8 submode) +static void BeginFastPaletteFadeInternal(u32 submode) { gPaletteFade.y = 31; gPaletteFade_submode = submode & 0x3F; @@ -568,9 +323,9 @@ static void BeginFastPaletteFadeInternal(u8 submode) UpdatePaletteFade(); } -static u8 UpdateFastPaletteFade(void) +static u32 UpdateFastPaletteFade(void) { - u16 i; + u32 i; u16 paletteOffsetStart; u16 paletteOffsetEnd; s8 r0; @@ -726,7 +481,7 @@ static u8 UpdateFastPaletteFade(void) return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; } -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) +void BeginHardwarePaletteFade(u32 blendCnt, u32 delay, u32 y, u32 targetY, u32 shouldResetBlendRegisters) { gPaletteFade_blendCnt = blendCnt; gPaletteFade.delayCounter = delay; @@ -744,7 +499,7 @@ void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 should gPaletteFade.yDec = 1; } -static u8 UpdateHardwarePaletteFade(void) +static u32 UpdateHardwarePaletteFade(void) { if (!gPaletteFade.active) return PALETTE_FADE_STATUS_DONE; @@ -805,7 +560,7 @@ static void UpdateBlendRegisters(void) } } -static bool8 IsSoftwarePaletteFadeFinishing(void) +static bool32 IsSoftwarePaletteFadeFinishing(void) { if (gPaletteFade.softwareFadeFinishing) { @@ -828,7 +583,7 @@ static bool8 IsSoftwarePaletteFadeFinishing(void) } } -void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) +void BlendPalettes(u32 selectedPalettes, u8 coeff, u32 color) { u16 paletteOffset; @@ -840,7 +595,7 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } } -void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) +void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u32 color) { void *src = gPlttBufferUnfaded; void *dest = gPlttBufferFaded; @@ -848,10 +603,10 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) BlendPalettes(selectedPalettes, coeff, color); } -void TintPalette_GrayScale(u16 *palette, u16 count) +void TintPalette_GrayScale(u16 *palette, u32 count) { - s32 r, g, b, i; - u32 gray; + s32 r, g, b; + u32 i, gray; for (i = 0; i < count; i++) { @@ -865,10 +620,10 @@ void TintPalette_GrayScale(u16 *palette, u16 count) } } -void TintPalette_GrayScale2(u16 *palette, u16 count) +void TintPalette_GrayScale2(u16 *palette, u32 count) { - s32 r, g, b, i; - u32 gray; + s32 r, g, b; + u32 i, gray; for (i = 0; i < count; i++) { @@ -887,10 +642,10 @@ void TintPalette_GrayScale2(u16 *palette, u16 count) } } -void TintPalette_SepiaTone(u16 *palette, u16 count) +void TintPalette_SepiaTone(u16 *palette, u32 count) { - s32 r, g, b, i; - u32 gray; + s32 r, g, b; + u32 i, gray; for (i = 0; i < count; i++) { @@ -911,10 +666,10 @@ void TintPalette_SepiaTone(u16 *palette, u16 count) } } -void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone) +void TintPalette_CustomTone(u16 *palette, u32 count, u16 rTone, u16 gTone, u16 bTone) { - s32 r, g, b, i; - u32 gray; + s32 r, g, b; + u32 i, gray; for (i = 0; i < count; i++) { diff --git a/src/scrcmd.c b/src/scrcmd.c index b642f41ede..4d391e0140 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -8,6 +8,7 @@ #include "contest_util.h" #include "contest_painting.h" #include "data.h" +#include "decompress.h" #include "decoration.h" #include "decoration_inventory.h" #include "event_data.h" @@ -656,12 +657,12 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) case FADE_TO_BLACK: case FADE_TO_WHITE: default: - CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); + CpuCopy32(gPlttBufferUnfaded, gDecompressionBuffer, PLTT_SIZE); FadeScreen(mode, 0); break; case FADE_FROM_BLACK: case FADE_FROM_WHITE: - CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); + CpuCopy32(gDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); FadeScreen(mode, 0); break; } From fd3cb6f96b1d9deaac4805e1d8bf767321198575 Mon Sep 17 00:00:00 2001 From: toon <123473450+anrichtait@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:26:14 +0200 Subject: [PATCH 040/225] How to docs and fixes to be added to the mdbook documentation site (#5070) * Added most of the documentation from the wiki to the mdbook site directory and fixed some errors * Removed the infinite repel documentation file * Update docs/SUMMARY.md --------- Co-authored-by: Eduardo Quezada --- docs/SUMMARY.md | 11 + docs/ai_logic.md | 31 + docs/how_to_battle_script_command_macro.md | 51 + docs/how_to_new_move.md | 197 +++ docs/how_to_new_pokemon_1_6_0.md | 1860 ++++++++++++++++++++ docs/how_to_new_pokemon_1_7_0.md | 1049 +++++++++++ docs/how_to_new_pokemon_1_8_0.md | 1049 +++++++++++ docs/how_to_new_pokemon_1_9_0.md | 1139 ++++++++++++ docs/how_to_testing_system.md | 578 ++++++ docs/how_to_trainer_class.md | 178 ++ 10 files changed, 6143 insertions(+) create mode 100644 docs/ai_logic.md create mode 100644 docs/how_to_battle_script_command_macro.md create mode 100644 docs/how_to_new_move.md create mode 100644 docs/how_to_new_pokemon_1_6_0.md create mode 100644 docs/how_to_new_pokemon_1_7_0.md create mode 100644 docs/how_to_new_pokemon_1_8_0.md create mode 100644 docs/how_to_new_pokemon_1_9_0.md create mode 100644 docs/how_to_testing_system.md create mode 100644 docs/how_to_trainer_class.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 3ff95a251c..fce328d858 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,6 +4,17 @@ - [Installation](./INSTALL.md) - [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md) - [AI Flags](./ai_flags.md) +- [Tutorials]() + - [How to add new AI Flags](./ai_logic.md) + - [How to add new battle script commands/macros](./how_to_battle_script_command_macro.md) + - [How to add a new move](./how_to_new_move.md) + - [How to add a new trainer class](./how_to_trainer_class.md) + - [How to add a new Pokémon]() + - [v1.9.0](./how_to_new_pokemon_1_9_0.md) + - [v1.8.0](./how_to_new_pokemon_1_8_0.md) + - [v1.7.0](./how_to_new_pokemon_1_7_0.md) + - [v1.6.0](./how_to_new_pokemon_1_6_0.md) + - [How to use the Testing System](./how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.9.x]() - [Version 1.9.0](changelogs/1.9.x/1.9.0.md) diff --git a/docs/ai_logic.md b/docs/ai_logic.md new file mode 100644 index 0000000000..b910d46946 --- /dev/null +++ b/docs/ai_logic.md @@ -0,0 +1,31 @@ +# How to add new AI Flags + +The battle engine upgrade has rewritten the AI battle scripts to C functions to easily add new logic. This tutorial explains how to add a new AI logic flag. + +## 1. Define your flag + +Open `include/constants/battle_ai.h`. We have many unused flags, but you can add a new one after `AI_FLAG_SMART_SWITCHING` like so: + +`#define AI_FLAG_SUPPORT (1 << 16)` + +## 2. Make your new function + +Open `src/battle_ai_main.c`. Search for the array `static s16 (*const sBattleAiFuncTable[])(u8, u8, u16, s16)`. We want to add our new function to this table. Since we have defined our flag as `(1 << 16)`, find the 16th entry in the table (identifiable by the initializer, `[16]`), and replace it with: + +`[16] = AI_Support, // AI_FLAG_SUPPORT` + +Define your function above the table as `static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score);` + +## Make your function do something + +at the bottom of the file, add: +```c +static s16 AI_Support(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) +{ + // Add your logic here! +} +``` + +## Give your trainer the correct AI flag! + +And that's it! diff --git a/docs/how_to_battle_script_command_macro.md b/docs/how_to_battle_script_command_macro.md new file mode 100644 index 0000000000..042a87601d --- /dev/null +++ b/docs/how_to_battle_script_command_macro.md @@ -0,0 +1,51 @@ +## How to add new Battle Script Commands/Macros + +To preface this tutorial, the battle engine upgrade has exhausted all battle script command IDs, and instead uses the `various` command to effectively add new commands. This is preferential to creating a secondary battle script command table like is done in the CFRU. + +In general, `gBattlescriptCurrInstr` tracks the current battle script position as a ROM address. Fortunately, we don't need to worry about ROM addresses when using the decomps, but it is important to understand because of how the `various` command is set up. + +``` +.macro various battler:req, param1:req + .byte 0x76 + .byte \battler + .byte \param1 + .endm +``` + +`various` is 3 bytes in size, so if we wanted to advance to the next battle script command, we would write `gBattlescriptCurrInstr += 3`. Coincidentally, this is found at the end of `Cmd_Various` in `src/battle_script_commands.c`. + +Now, how might we add a custom various command case? Here are the steps. We will use `VARIOUS_SET_SIMPLE_BEAM` as an example. +### 1. Add a definition to `include/constants/battle_script_commands.h`. + +For example, `#define VARIOUS_SET_SIMPLE_BEAM 39` + +### 2. Create a macro in `asm/macros/battle_script.inc`. For example: +```c +.macro setabilitysimple battler:req, ptr:req + various \battler VARIOUS_SET_SIMPLE_BEAM + .4byte \ptr + .endm +``` + +### 3. Add your new various command ID to `Cmd_Various`. For example: +```c + case VARIOUS_SET_SIMPLE_BEAM: + if (IsEntrainmentTargetOrSimpleBeamBannedAbility(gBattleMons[gBattlerTarget].ability) + || gBattleMons[gBattlerTarget].ability == ABILITY_SIMPLE) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gBattleMons[gBattlerTarget].ability = ABILITY_SIMPLE; + RecordAbilityBattle(gActiveBattler, ABILITY_SIMPLE); + gBattlescriptCurrInstr += 7; + } + return; +``` + +The macros' `battler` argument is the battler who will be affected/considered by your command. In our case, which battler we will try to give `ABILITY_SIMPLE`. Note that `gActiveBattler` is always set to this battler at the beginning of `Cmd_Various`. + +The `ptr` argument is an extra argument that, in this case, provides a battle script to jump to in the event that we fail to set `ABILITY_SIMPLE`. We must add the `.4byte \ptr` inside our macro. So now when we want to advance to the next battle script command in our script, we must increment `gBattlescriptCurrInstr` by `7` because our overall macro is 3 bytes for the various command, and 4 bytes for the pointer. *IMPORTANT* the `return` at the end of the switch case is required because remember that `various` always defaults to `gBattlescriptCurrInstr += 3` at the very end of the function, so if we included `gBattlescriptCurrInstr += 7` with a `break`, we would end up effectively doing `gBattlescriptCurrInstr += 10`. + +This behavior can be found under the `else` statement in the example above, corresponding to `ABILITY_SIMPLE` being correctly applied. If we are unable to set `ABILITY_SIMPLE`, however, notice the following `gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);`. This means we are jumping to the battle script provided by the pointer 3 bytes after our various command (which is the `ptr` argument described previously). We still must `return` or else we would actually jump to 3 bytes after the `ptr` battle script begins. diff --git a/docs/how_to_new_move.md b/docs/how_to_new_move.md new file mode 100644 index 0000000000..9ddc09b904 --- /dev/null +++ b/docs/how_to_new_move.md @@ -0,0 +1,197 @@ +*Full credits and thank you to CancerFairy for writing this guide!* + +### Note: This guide was written for version 1.8.0. Most stuff still applies to 1.7.x versions and earlier, with the following exceptions: +- Battle and Contest move data are separated in `src/data/battle_moves.h` and `src/data/contest_moves.h` +- `additionalEffects` doesn't exist, instead being handled by a combination of `secondaryEffectChance` and unique `EFFECT_xxx`s. +- There's no `include/constants/battle_move_effects.h`, so data specific to certain effects is handled in other places. +- Move names are handled in `gMoveNames`. + +# Adding/editing moves +This guide is here to give you a breakdown of how moves work, how to edit existing ones, and how to add your own. + +## Contents: +1. [Key files and definitions](#key-files-and-definitions) + - [Header files](#header-files) + - [C files](#c-files) + - [Script files](#script-files) +2. [Editing a move](#editing-a-move) +3. [Adding a new move](#adding-a-new-move) + +## Key files and definitions +Before beginning the process, it's important to familiarise yourself with the important files that control moves. There are three categories of files - header(.h) files, which contain static information about a move, .c files which contains functions in C that determine how the move behaves, and script files (.s or .inc) that actually "run" the move - i.e. determine the sequence of events you see on screen when you execute the move. + +## Header files +### src/data/moves_info.h +This is the place where the bulk of move information is stored, including name, base power, typing, PP, contest information etc. + +Let's look at an example: +```c +[MOVE_THUNDER_SHOCK] = +{ + .name = HANDLE_EXPANDED_MOVE_NAME("ThunderShock", "Thunder Shock"), + .description = COMPOUND_STRING( + "An electrical attack that\n" + "may paralyze the foe."), + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .category = DAMAGE_CATEGORY_SPECIAL, + .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }), + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .contestComboStarterId = 0, + .contestComboMoves = {COMBO_STARTER_CHARGE}, +}, +``` +The `HANDLE_EXPANDED_MOVE_NAME` allows the usage of a name of extended character length, so long as the `B_EXPANDED_MOVE_NAMES` is set to `TRUE`, whereas by default it's limited in Gen 3 to 12 characters. Most of the fields here are obvious, but the two important ones for determining what a move actually *does* are `effect` and `additionalEffects`. + +The `effect` represents how the move actually works when called in battle - it can be a two turn move, or a move that only works if the target is holding an item, for example. How each effect works is pretty much unique, but the way a move of a particular effect is executed is defined by a script [`data/battle_scripts_1.s`](#databattle_scripts_1s), and any *variable* characteristics such as typing or power are defined in either [`src/battle_script_commands.c`](#srcbattle_script_commandsc) or [`src/battle_util.c`](#srcbattle_utilc), depending on the effect. The vast majority of non-status moves are simply `EFFECT_HIT`, in that they deal damage and apply `additionalEffects` (if defined). + +The `additionalEffects` field represents effects that are applied at the `setadditionaleffects` stage of the move script (for most moves, see `BattleScript_Hit_RetFromAtkAnimation`). These are effects that can be encapsulated by any of the `MOVE_EFFECT_X` defined in [`include/constants/battle.h`](#includeconstantsbattleh) and encoded under `SetMoveEffect` in [`src/battle_script_commands.c`](#srcbattle_script_commandsc). These can vary from applying a status, such as `MOVE_EFFECT_PARALYSIS`, or lowering/raising stats etc. The move effect could target the user by setting `self = TRUE`, such as Overheat lowering the user's own Sp. Atk. What's more, definining a `chance`, such as for Thunder Shock, not only limits the effect to applying only `chance`% of the time, but it also turns it into a *secondary effect.* This difference is important because secondary effects are nullified by Sheer Force (which in turn will boost the move's power) and they are blocked by Shield Dust. These two limitations do not apply to *primary effects* which do not a chance field defined and by definition will *always* happen when the move is executed. + +### src/data/battle_move_effects.h +Effects are listed here along with the `battleScript` that governs each one. Said scripts are defined in [`data/battle_scripts_1.s`](#databattle_scripts_1s). The indices/names of the effects (e.g. `EFFECT_FIRST_TURN_ONLY`) are enums defined in [`include/constants/battle_move_effects.h`](#includeconstantsbattle_move_effectsh). + +### include/battle_scripts.h +Contains references to scripts [`data/battle_scripts_1.s`](#databattle_scripts_1s), allowing them to be referenced in C. Any new scripts must be added here. + +### include/constants/battle_move_effects.h +Simply an enum list of possible effects for moves. Any new effects would be added here, with a definition for them (including defining a script) would then also be added to [`src/data/battle_move_effects.h`](#srcdatabattle_move_effectsh). + +### include/constants/battle_string_ids.h +All strings that can be printed in battle have an id that is defined here. The actual message itself would then be defined and assigned to this id in [`src/data/battle_message.c`](#srcbattle_messagec). + +### include/constants/battle.h +A whole range of constants defining battle variables, such as statuses, weather, and move effects. + +### include/constants/moves.h +Where moves are defined (and nothing else). + +**Note:** When adding custom moves, you should add them between the moves from the latest generation and the z moves, then adjust `MOVES_COUNT` accordingly. Adding a move after `MOVES_COUNT` that is neither a Max Move or a Z Move will result in that move's name not being printed when it is used, instead a generic message will be printed. + +## C files +### src/battle_script_commands.c +This is where a lot of the commands referred to in scripts are defined. For example, the `jumpifnotfirstturn` command above is defined by the function `Cmd_jumpifnotfirstturn` and you can see how it works in C. It's possible that any move editing or updating you have in mind can be done with existing commands, but if you wanted to add a new function that could be called in a script above, this is where you would define it. + +### src/battle_util.c +This contains a lot of the "utility" functions used to determine things like a move's dynamic typing or power. It's also where damage calculation takes place, and a lot of that will naturally take a move's effect into account. For example, a move with the effect `EFFECT_SOLAR_BEAM` would have its damage halved in sandstorm. If you wanted to add a move with an effect which gave it variable BP or typing, this is the file you would encode that effect. + +### src/battle_message.c +Contains string defines and functions that print messages during the battle. If you wish to add or edit a move's string, then this is where you would do so. + +### src/battle_main.c +Contains more fundamental functions that control the flow of the battle. Functions here determine move order, dynamic typing, animations, priority, speed calculations and more. + +## Script files +### data/battle_scripts_1.s +Each move's effect is governed by a script defined here. For a simple example, let's look at the script for Fake Out/First Impression: + +``` +BattleScript_EffectFirstTurnOnly:: + attackcanceler + jumpifnotfirstturn BattleScript_FailedFromAtkString + goto BattleScript_EffectHit +``` + +`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_FailedFromAtkString` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else. + +This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know. + +### asm/macros/battle_script.inc +The "link" between [`data/battle_scripts_1.s`](#databattle_scripts_1s) and [`src/battle_script_commands.c`](#srcbattle_script_commandsc). Each command is represented by a hex byte which represents its index in the `gBattleScriptingCommandsTable` array at the top of [`src/battle_script_commands.c`](#srcbattle_script_commandsc). However, this file also contains macros which perform combinations of other commands, or just calculations in assembly. In addition to commands, it is also possible to call functions in [`src/battle_script_commands.c`](#srcbattle_script_commandsc) using the `various` (now gradually being deprecated) and the `callnative` functionality. The `various` macros will point to a case under the `Cmd_various` function in [`src/battle_script_commands.c`](#srcbattle_script_commandsc), whereas `callnative` will let you directly call a function in [`src/battle_script_commands.c`](#srcbattle_script_commandsc) by name. + +### data/battle_anim_scripts.s +This is the place where move animations are defined. The array at the top, `gBattleAnims_Moves`, is in move index order and determines which animation goes with which move. + +## Editing a move +### Basic information +To edit a move's basic information, you need only edit the relevant fields in [`src/data/battle_moves.h`](#srcdatamoves_infoh). This will let you change a move's: +- name +- description +- power +- accuracy +- type +- category +- target +- pp +- recoil percentage +- flags +- Z-move effect (for status moves) or overwritting its calculated power (for damaging moves) + +### Changing a move's main effect +To change the main effect of a move to an existing effect, you need only change its `effect` field to one of the options in [`src/data/battle_move_effects.h`](#srcdatabattle_move_effectsh). If you wish to keep the effect but simply modify how it works, you can modify how it plays out on screen by editing its entry in [`data/battle_scripts_1.s`](#databattle_scripts_1s) and any relevant functions in [`src/battle_script_commands.c`](#srcbattle_script_commandsc). To change how a move's dynamic power, accuracy and are calculated, then you need to modify the following functions: + +- For power: `CalcMoveBasePowerAfterModifiers` in [`src/battle_util.c`](#srcbattle_utilc) +- For accuracy: `AccuracyCalcHelper` in [`src/battle_script_commands.c`](#srcbattle_script_commandsc) +- For type: `SetTypeBeforeUsingMove` in [`src/battle_main.c`](#srcbattle_mainc) + +Note: A generic function for calculating category does not currently exist - Photon Geyser's script in [`data/battle_scripts_1.s`](#databattle_scripts_1s) uses a special `callnative` function `BS_SetPhotonGeyserCategory`. + +### Changing a move's additional effects +If you look at the example [here](#srcdatamoves_infoh), you can see that Thunder Shock has an additional effects array that contains a single move effect `MOVE_EFFECT_PARALYSIS` with a 10% chance of applying. Thanks to this field, you can add and remove primary and secondary effects (so long as they are defined by a `MOVE_EFFECT`) to a move without having to change its effect or script. You can also make an effect apply to the attacker rather than the target (for, say, a stat boost) with `.self = TRUE` and you can set the probability to whatever you want with the `chance` field. + +All additional effects with a defined chance (even 100%) are treated as "secondary effects". This means that they are nullified by Sheer Force, blocked by Shield Dust or the Covert Cloak, and have their chance modified by Serene Grace. Additional effects without a chance field (effectively setting it to 0) are treated as "primary effects", which means that they cannot be blocked by the aforementioned items and abilities and their chance to occur cannot be modified; they will *always* happen. + +Each move can have up to 15 additional effects, allowing you to construct monstrosities like this: +``` +[MOVE_POUND] = +{ + .name = COMPOUND_STRING("Pound"), + .description = COMPOUND_STRING( + "Pounds the foe with\n" + "forelegs or tail."), + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 35, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + },{ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 100, + },{ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + },{ + .moveEffect = MOVE_EFFECT_ALL_STATS_UP, + .chance = 40, + .self = TRUE, + },{ + .moveEffect = MOVE_EFFECT_RAPID_SPIN, + },{ + .moveEffect = MOVE_EFFECT_DEF_MINUS_2, + .chance = 50, + }), + .makesContact = TRUE, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS == GEN_4, + .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .contestComboStarterId = COMBO_STARTER_POUND, + .contestComboMoves = {0} +}, +``` + +**Note: at the moment, additional effects can only be used by damaging moves, not by status moves.** + +## Adding a new move +To add a new move, you need to create an entry in three locations: + +- a define in [`include/constants/moves.h`](#includeconstantsmovesh) +- an info entry in [`src/data/battle_moves.h`](#srcdatamoves_infoh) +- an animation entry in [data/battle_anim_scripts.s](#databattle_anim_scriptss) + +And that's it! You can use an existing animation or effect for your move - or you can add your own, but I'll leave figuring that out to you. + diff --git a/docs/how_to_new_pokemon_1_6_0.md b/docs/how_to_new_pokemon_1_6_0.md new file mode 100644 index 0000000000..d965e48a5f --- /dev/null +++ b/docs/how_to_new_pokemon_1_6_0.md @@ -0,0 +1,1860 @@ +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to Version 1.6.2 and lower. +- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) +- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) +- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. + +# Content +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Animate the sprites](#3-animate-the-sprites) + * [4. Update the tables](#4-update-the-tables) +* [The Data](#the-data) + * [1. Declare a species constant](#1-declare-a-species-constant) + * [2. Devise a name](#2-devise-a-name) + * [3. Define its Pokédex entry](#3-define-its-pokédex-entry) + * [4. Define its species information](#4-define-its-species-information) + * [5. Delimit the moveset](#5-delimit-the-moveset) + * [6. Define its cry](#6-define-its-cry) + * [7. Define the Evolutions](#7-define-the-evolutions) + * [8. Easy Chat about your Pokémon](#8-easy-chat-about-your-pokémon) + * [9. Make it appear!](#9-make-it-appear) +* [Appendix](#appendix) + * [Available Front Animations](#available-front-animations) + * [Available Back Animations](#available-back-animations) + * [Pokémon ordered by height](#pokémon-ordered-by-height) + * [Pokémon ordered by weight](#pokémon-ordered-by-weight) + * [Making this easier](#making-this-easier) + + +# The Graphics +We will start by copying the folder containing the sprites for Mewtwo and rename it to `mewthree` (pretty meta huh?): +```sh +cp -r graphics/pokemon/mewtwo graphics/pokemon/mewthree +``` +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I have used GIMP) and change `anim_front.png`, `front.png` and `back.png` to meet your expectations. +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. Notice, that the icon will use one of three predefined palettes instead of `normal.pal`. + +## 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. +Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h): + +```diff + extern const u32 gMonFrontPic_Calyrex[]; ++extern const u32 gMonFrontPic_Mewthree[]; +``` + +```diff + extern const u32 gMonBackPic_Calyrex[]; ++extern const u32 gMonBackPic_Mewthree[]; +``` + +```diff + extern const u32 gMonPalette_Calyrex[]; ++extern const u32 gMonPalette_Mewthree[]; +``` + +```diff + extern const u32 gMonShinyPalette_Calyrex[]; ++extern const u32 gMonShinyPalette_Mewthree[]; +``` + +```diff + //extern const u8 gMonIcon_Calyrex[]; ++extern const u8 gMonIcon_Mewthree[]; +``` + +```diff + extern const u8 gMonFootprint_Calyrex[]; ++extern const u8 gMonFootprint_Mewthree[]; +``` + +Now link the graphic files. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff + const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.lz"); ++const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/front.4bpp.lz"); +``` + +```diff + const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.lz"); ++const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); +``` + +```diff + const u32 gMonPalette_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/normal.gbapal.lz"); ++const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); +``` + +```diff + const u32 gMonShinyPalette_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/shiny.gbapal.lz"); ++const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); +``` + +```diff + //const u8 gMonIcon_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/icon.4bpp"); ++const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); +``` + +```diff + const u8 gMonFootprint_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/footprint.1bpp"); ++const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Calyrex, the Pokémon that should be above your insertion for the time being, reads a "front.png" sprite instead of an "anim_front.png" sprite. This is because currently, Calyrex lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use "anim_front". + +It is also worth to mention that Calyrex's icon sprite is commented out simply because it's currently missing. If you do have an icon sprite sheet present inside your species' folder at `graphics/pokemon`, by all means do not comment entries involving the `gMonIcon` constants. + +## 3. Animate the sprites + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +static const union AnimCmd sAnim_Enamorus_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +#endif +``` + +```diff +SINGLE_ANIMATION(Enamorus); ++SINGLE_ANIMATION(Mewthree); +#endif +``` + +```diff + const union AnimCmd *const *const gMonFrontAnimsPtrTable[] = + { + [SPECIES_NONE] = sAnims_None, + [SPECIES_BULBASAUR] = sAnims_Bulbasaur, + ... + [SPECIES_ENAMORUS] = sAnims_Enamorus, ++ [SPECIES_MEWTHREE] = sAnims_Mewthree, +#endif + ... + }; +``` + +Because you are limited to two frames, there are already [predefined front sprite animations](#available-front-animations), describing translations, rotations, scalings or color changes. + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): +```diff + static const u8 sMonFrontAnimIdsTable[] = + { + [SPECIES_BULBASAUR - 1] = ANIM_V_JUMPS_H_JUMPS, + ... + [SPECIES_DEOXYS_SPEED - 1] = ANIM_GROW_VIBRATE, ++ [SPECIES_MEWTHREE - 1] = ANIM_GROW_VIBRATE, + }; +``` + +There are also [predefined back sprite animations](#available-back-animations) for the back sprites as well. + +Edit [src/pokemon_animation.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon_animation.c): + +```diff + static const u8 sSpeciesToBackAnimSet[] = + { + [SPECIES_BULBASAUR] = BACK_ANIM_DIP_RIGHT_SIDE, + ... + [SPECIES_CHIMECHO] = BACK_ANIM_CONVEX_DOUBLE_ARC, ++ [SPECIES_MEWTHREE] = BACK_ANIM_GROW_STUTTER, + }; +``` + +If you want to delay the time between when the Pokémon appears and when the animation starts, you can add an entry to `sMonAnimationDelayTable` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + static const u8 sMonAnimationDelayTable[NUM_SPECIES - 1] = + { + [SPECIES_BLASTOISE - 1] = 50, + ... + [SPECIES_KYOGRE - 1] = 60, + [SPECIES_RAYQUAZA - 1] = 60, ++ [SPECIES_MEWTHREE - 1] = 15, + }; +``` + +If you want your Pokémon to fly above the ground, you can add an entry to `gEnemyMonElevation`. + +Edit [src/data/pokemon_graphics/enemy_mon_elevation.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/enemy_mon_elevation.h): + +```diff + const u8 gEnemyMonElevation[NUM_SPECIES] = + { + [SPECIES_BUTTERFREE] = 10, + ... + [SPECIES_REGIDRAGO] = 5, ++ [SPECIES_MEWTHREE] = 6, + }; +``` + +## 4. Update the tables + +Edit [src/data/pokemon_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_table.h): + +```diff + const struct CompressedSpriteSheet gMonFrontPicTable[] = + { + SPECIES_SPRITE(NONE, gMonFrontPic_CircledQuestionMark), + SPECIES_SPRITE(BULBASAUR, gMonFrontPic_Bulbasaur), + ... + SPECIES_SPRITE(ENAMORUS, gMonFrontPic_Enamorus), ++ SPECIES_SPRITE(MEWTHREE, gMonFrontPic_Mewthree), +#endif + ... +}; +``` + +Edit [src/data/pokemon_graphics/front_pic_coordinates.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_coordinates.h): + +```diff + const struct MonCoords gMonFrontPicCoords[] = + { + ... + [SPECIES_ENAMORUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, ++ [SPECIES_MEWTHREE] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, +#endif + ... + }; +``` + +Edit [src/data/pokemon_graphics/back_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/back_pic_table.h): + +```diff + const struct CompressedSpriteSheet gMonBackPicTable[] = + { + SPECIES_SPRITE(NONE, gMonBackPic_CircledQuestionMark), + SPECIES_SPRITE(BULBASAUR, gMonBackPic_Bulbasaur), + ... + SPECIES_SPRITE(ENAMORUS, gMonBackPic_Enamorus), ++ SPECIES_SPRITE(MEWTHREE, gMonBackPic_Mewthree), +#endif + ... + }; +``` + +Edit [src/data/pokemon_graphics/back_pic_coordinates.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/back_pic_coordinates.h): + +```diff + const struct MonCoords gMonBackPicCoords[] = + { + ... + [SPECIES_ENAMORUS] = { .size = MON_COORDS_SIZE(64, 64), .y_offset = 0 }, ++ [SPECIES_MEWTHREE] = { .size = MON_COORDS_SIZE(56, 64), .y_offset = 1 }, +#endif + ... + }; +``` + +Edit [src/data/pokemon_graphics/footprint_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/footprint_table.h): + +```diff + const u8 *const gMonFootprintTable[] = + { + [SPECIES_NONE] = gMonFootprint_Bulbasaur, + [SPECIES_BULBASAUR] = gMonFootprint_Bulbasaur, + ... + [SPECIES_CALYREX] = gMonFootprint_Calyrex, ++ [SPECIES_MEWTHREE] = gMonFootprint_Mewthree, +#endif + [SPECIES_EGG] = gMonFootprint_Bulbasaur, + }; +``` + +Edit [src/data/pokemon_graphics/palette_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/palette_table.h): + +```diff + const struct CompressedSpritePalette gMonPaletteTable[] = + { + SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark), + SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur), + ... + SPECIES_PAL(ENAMORUS, gMonPalette_Enamorus), ++ SPECIES_PAL(MEWTHREE, gMonPalette_Mewthree), +#endif + ... +}; +``` + +Edit [src/data/pokemon_graphics/shiny_palette_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/shiny_palette_table.h): + +```diff +const struct CompressedSpritePalette gMonShinyPaletteTable[] = +{ + SPECIES_SHINY_PAL(NONE, gMonShinyPalette_CircledQuestionMark), + SPECIES_SHINY_PAL(BULBASAUR, gMonShinyPalette_Bulbasaur), + ... + SPECIES_SHINY_PAL(ENAMORUS, gMonShinyPalette_Enamorus), ++ SPECIES_SHINY_PAL(MEWTHREE, gMonShinyPalette_Mewthree), +#endif + ... +}; +``` + +Edit [src/pokemon_icon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon_icon.c): + +```diff + const u8 *const gMonIconTable[] = + { + [SPECIES_NONE] = gMonIcon_Bulbasaur, + ... + [SPECIES_ENAMORUS] = gMonIcon_Enamorus, ++ [SPECIES_MEWTHREE] = gMonIcon_Mewthree, +#endif + ... + }; +``` + +```diff + const u8 gMonIconPaletteIndices[] = + { + [SPECIES_NONE] = 0, + ... + [SPECIES_ENAMORUS] = 1, ++ [SPECIES_MEWTHREE] = 2, + [SPECIES_VENUSAUR_MEGA] = 1, + ... + }; +``` + +Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. + +Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. + +# The Data + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_ENAMORUS 905 ++#define SPECIES_MEWTHREE 906 + +-#define FORMS_START SPECIES_ENAMORUS ++#define FORMS_START SPECIES_MEWTHREE +``` + +## 2. Devise a name + + +This name will be displayed in the game. It may be different than the identifier of the species constant, especially when there are special characters involved. + +Edit [src/data/text/species_names.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/text/species_names.h): + +```diff + const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = { + [SPECIES_NONE] = _("??????????"), + [SPECIES_BULBASAUR] = _("Bulbasaur"), + ... + [SPECIES_ENAMORUS] = _("Enamorus"), ++ [SPECIES_MEWTHREE] = _("Mewthree"), + }; +``` + +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 3. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_ENAMORUS, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI +#if P_GEN_8_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_ENAMORUS ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +... +}; +``` + +```diff +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + + +```diff + // Assigns all species to the National Dex Index (Summary No. for National Dex) + static const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] = + { + SPECIES_TO_NATIONAL(ENAMORUS), ++ SPECIES_TO_NATIONAL(MEWTHREE), + }; +``` + +Just like before, if we want to insert our new species in the Hoenn Dex, we'll have to do a few extra steps: + +```diff + // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex) + static const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] = + { + SPECIES_TO_HOENN(TREECKO), + ... + SPECIES_TO_HOENN(DEOXYS), ++ SPECIES_TO_HOENN(MEWTHREE), + }; +``` + +```diff + const u16 gHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can define the actual text of the Pokédex entry. + +Append to [src/data/pokemon/pokedex_text.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_text.h): + +```diff + const u8 gEnamorusPokedexText[] = _( + "Its arrival brings an end to the\n" + "winter. According to legend, this\n" + "Pokémon's love gives rise to the\n" + "budding of fresh life across the land."); + ++const u8 gMewthreePokedexText[] = _( ++ "The rumors became true.\n" ++ "This is Mews final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"); +``` + +Finally, we will add the Pokédex entry for Mewthree and link the text to it. + +Edit [src/data/pokemon/pokedex_entries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_entries.h): + +```diff + const struct PokedexEntry gPokedexEntries[] = + { + ... + [NATIONAL_DEX_ENAMORUS] = + { + .categoryName = _("Love-Hate"), + .height = 16, + .weight = 480, + .description = gEnamorusPokedexText, + .pokemonScale = 259, + .pokemonOffset = 1, + .trainerScale = 296, + .trainerOffset = 1, + }, + ++ [NATIONAL_DEX_MEWTHREE] = ++ { ++ .categoryName = _("NEW SPECIES"), ++ .height = 15, ++ .weight = 330, ++ .description = gMewthreePokedexText, ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, ++ }, + #endif + }; +``` + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. Height and weight are specified in meters and kilograms respectively, while the last digit is the first decimal place. + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight. To find the right position for your Pokémon, you may look at the tables sorted by [height](#pokémon-ordered-by-height) and [weight](#pokémon-ordered-by-weight) respectively in the appendix. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN, // Alolan Form + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + NATIONAL_DEX_ZERAORA, + NATIONAL_DEX_GRIMMSNARL, + NATIONAL_DEX_MR_RIME, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` + +## 4. Define its species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_ENAMORUS] = + { + .baseHP = 74, + .baseAttack = 115, + .baseDefense = 70, + .baseSpeed = 106, + .baseSpAttack = 135, + .baseSpDefense = 80, + .types = { TYPE_FAIRY, TYPE_FLYING}, + .catchRate = 3, + .expYield = 261, + .evYield_SpAttack = 3, + .genderRatio = MON_FEMALE, + .eggCycles = 120, + .friendship = 90, + .growthRate = GROWTH_SLOW, + .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, + .abilities = {ABILITY_HEALER, ABILITY_NONE, ABILITY_CONTRARY}, + .bodyColor = BODY_COLOR_PINK, + .noFlip = FALSE, + .flags = SPECIES_FLAG_LEGENDARY, + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC}, ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, ++ .abilities = {ABILITY_INSOMNIA, ABILITY_NONE}, ++ .safariZoneFleeRate = 0, ++ .bodyColor = BODY_COLOR_PURPLE, ++ .noFlip = FALSE, ++ }, +#endif + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h) and here [src/data/text/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/text/abilities.h). + +You can also incorporate a 3rd ability to your species, which is intended to be a [Hidden Ability](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities)! + +## 5. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets.h): + +```diff +static const struct LevelUpMove sEnamorusLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 7, MOVE_BITE), + LEVEL_UP_MOVE(11, MOVE_TWISTER), + LEVEL_UP_MOVE(14, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(22, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(31, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(47, MOVE_MOONBLAST), + LEVEL_UP_MOVE( 1, MOVE_SPRINGTIDE_STORM), + LEVEL_UP_END +}; + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ 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 ++}; +#endif +``` + +Again, we need to register the learnset. + +Edit [src/data/pokemon/level_up_learnset_pointers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnset_pointers.h): + +```diff + const struct LevelUpMove *const gLevelUpLearnsets[NUM_SPECIES] = + { + [SPECIES_NONE] = sBulbasaurLevelUpLearnset, + [SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset, + ... + [SPECIES_ENAMORUS] = sEnamorusLevelUpLearnset, ++ [SPECIES_MEWTHREE] = sMewthreeLevelUpLearnset, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +static const u16 sEnamorusTeachableLearnset[] = { + MOVE_UNAVAILABLE, +}; + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ MOVE_HIDDEN_POWER, ++ MOVE_SUNNY_DAY, ++ MOVE_TAUNT, ++ MOVE_ICE_BEAM, ++ MOVE_BLIZZARD, ++ MOVE_HYPER_BEAM, ++ MOVE_LIGHT_SCREEN, ++ MOVE_PROTECT, ++ MOVE_RAIN_DANCE, ++ MOVE_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, ++}; +#endif +``` + +Once more, we need to register the learnset. + +Edit [src/data/pokemon/teachable_learnset_pointers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnset_pointers.h): + +```diff +const u16 *const gTeachableLearnsets[NUM_SPECIES] = + { + [SPECIES_NONE] = sBulbasaurTeachableLearnset, + [SPECIES_BULBASAUR] = sBulbasaurTeachableLearnset, + ... + [SPECIES_ENAMORUS] = sEnamorusTeachableLearnset, ++ [SPECIES_MEWTHREE] = sMewthreeTeachableLearnset, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + +## 6. Define its cry +First run these command to copy the Mewtwo sound files: +```sh +cp -r sound/direct_sound_samples/cries/mewtwo.bin sound/direct_sound_samples/cries/mewthree.bin +cp -r sound/direct_sound_samples/cries/mewtwo.aif sound/direct_sound_samples/cries/mewthree.aif +``` + +In [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff + .align 2 +Cry_Enamorus:: + .incbin "sound/direct_sound_samples/cries/enamorus.bin" + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +.endif +``` + +And linking it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. + +```diff +... + cry Cry_Enamorus ++ cry Cry_Mewthree +.else +``` + +```diff + cry_reverse Cry_Overqwil ++ cry_reverse Cry_Mewthree +.else +``` + +Mon cries are 10512Hz. Make sure to put the aif file in the directory [sound/direct_sound_samples/cries](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_samples/cries) + +Higher frequencies may be ruined by compression. To have the cries uncompressed, follow [this](https://github.com/ShinyDragonHunter/pokefirereddx/commit/71ba1c193082817afbed9a8a0ba1d123fffb6f36#diff-e1823f56db7c2344fb9ee843e3c42797f72fa1e108e13a7080018e1db545322eR116) , then clear out the old sound bins + +## 7. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit [src/data/pokemon/evolution.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/evolution.h): + +```diff + [SPECIES_SNEASEL_HISUIAN] = {{EVO_ITEM_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER}, + {EVO_ITEM_HOLD_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER}}, ++ [SPECIES_MEWTWO] = {{EVO_LEVEL, 100, SPECIES_MEWTHREE}}, +#endif +``` + +## 8. Easy Chat about your Pokémon + + +Edit [src/data/easy_chat/easy_chat_words_by_letter.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/easy_chat/easy_chat_words_by_letter.h): + +```diff + const u16 gEasyChatWordsByLetter_M[] = { + EC_MOVE2(MACH_PUNCH), + ... + EC_POKEMON_NATIONAL(MEW), ++ EC_POKEMON_NATIONAL(MEWTHREE), + EC_POKEMON_NATIONAL(MEWTWO), + ... + EC_WORD_MYSTERY, + }; +``` + +## 9. Make it appear! + + +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Appendix +## Available Front Animations +_Only 65 are used in-game, but you can use any animation from this list._ +1. ANIM_V_SQUISH_AND_BOUNCE +2. ANIM_CIRCULAR_STRETCH_TWICE +3. ANIM_H_VIBRATE +4. ANIM_H_SLIDE +5. ANIM_V_SLIDE +6. ANIM_BOUNCE_ROTATE_TO_SIDES +7. ANIM_V_JUMPS_H_JUMPS +8. ANIM_ROTATE_TO_SIDES +9. ANIM_ROTATE_TO_SIDES_TWICE +10. ANIM_GROW_VIBRATE +11. ANIM_ZIGZAG_FAST +12. ANIM_SWING_CONCAVE +13. ANIM_SWING_CONCAVE_FAST +14. ANIM_SWING_CONVEX +15. ANIM_SWING_CONVEX_FAST +16. ANIM_H_SHAKE +17. ANIM_V_SHAKE +18. ANIM_CIRCULAR_VIBRATE +19. ANIM_TWIST +20. ANIM_SHRINK_GROW +21. ANIM_CIRCLE_C_CLOCKWISE +22. ANIM_GLOW_BLACK +23. ANIM_H_STRETCH +24. ANIM_V_STRETCH +25. ANIM_RISING_WOBBLE +26. ANIM_V_SHAKE_TWICE +27. ANIM_TIP_MOVE_FORWARD +28. ANIM_H_PIVOT +29. ANIM_V_SLIDE_WOBBLE +30. ANIM_H_SLIDE_WOBBLE +31. ANIM_V_JUMPS_BIG +32. ANIM_SPIN_LONG +33. ANIM_GLOW_ORANGE +34. ANIM_GLOW_RED +35. ANIM_GLOW_BLUE +36. ANIM_GLOW_YELLOW +37. ANIM_GLOW_PURPLE +38. ANIM_BACK_AND_LUNGE +39. ANIM_BACK_FLIP +40. ANIM_FLICKER +41. ANIM_BACK_FLIP_BIG +42. ANIM_FRONT_FLIP +43. ANIM_TUMBLING_FRONT_FLIP +44. ANIM_FIGURE_8 +45. ANIM_FLASH_YELLOW +46. ANIM_SWING_CONCAVE_FAST_SHORT +47. ANIM_SWING_CONVEX_FAST_SHORT +48. ANIM_ROTATE_UP_SLAM_DOWN +49. ANIM_DEEP_V_SQUISH_AND_BOUNCE +50. ANIM_H_JUMPS +51. ANIM_H_JUMPS_V_STRETCH +52. ANIM_ROTATE_TO_SIDES_FAST +53. ANIM_ROTATE_UP_TO_SIDES +54. ANIM_FLICKER_INCREASING +55. ANIM_TIP_HOP_FORWARD +56. ANIM_PIVOT_SHAKE +57. ANIM_TIP_AND_SHAKE +58. ANIM_VIBRATE_TO_CORNERS +59. ANIM_GROW_IN_STAGES +60. ANIM_V_SPRING +61. ANIM_V_REPEATED_SPRING +62. ANIM_SPRING_RISING +63. ANIM_H_SPRING +64. ANIM_H_REPEATED_SPRING_SLOW +65. ANIM_H_SLIDE_SHRINK +66. ANIM_LUNGE_GROW +67. ANIM_CIRCLE_INTO_BG +68. ANIM_RAPID_H_HOPS +69. ANIM_FOUR_PETAL +70. ANIM_V_SQUISH_AND_BOUNCE_SLOW +71. ANIM_H_SLIDE_SLOW +72. ANIM_V_SLIDE_SLOW +73. ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL +74. ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW +75. ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW +76. ANIM_ZIGZAG_SLOW +77. ANIM_H_SHAKE_SLOW +78. ANIM_V_SHAKE_SLOW +79. ANIM_TWIST_TWICE +80. ANIM_CIRCLE_C_CLOCKWISE_SLOW +81. ANIM_V_SHAKE_TWICE_SLOW +82. ANIM_V_SLIDE_WOBBLE_SMALL +83. ANIM_V_JUMPS_SMALL +84. ANIM_SPIN +85. ANIM_TUMBLING_FRONT_FLIP_TWICE +86. ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE +87. ANIM_H_JUMPS_V_STRETCH_TWICE +88. ANIM_V_SHAKE_BACK +89. ANIM_V_SHAKE_BACK_SLOW +90. ANIM_V_SHAKE_H_SLIDE_SLOW +91. ANIM_V_STRETCH_BOTH_ENDS_SLOW +92. ANIM_H_STRETCH_FAR_SLOW +93. ANIM_V_SHAKE_LOW_TWICE +94. ANIM_H_SHAKE_FAST +95. ANIM_H_SLIDE_FAST +96. ANIM_H_VIBRATE_FAST +97. ANIM_H_VIBRATE_FASTEST +98. ANIM_V_SHAKE_BACK_FAST +99. ANIM_V_SHAKE_LOW_TWICE_SLOW +100. ANIM_V_SHAKE_LOW_TWICE_FAST +101. ANIM_CIRCLE_C_CLOCKWISE_LONG +102. ANIM_GROW_STUTTER_SLOW +103. ANIM_V_SHAKE_H_SLIDE +104. ANIM_V_SHAKE_H_SLIDE_FAST +105. ANIM_TRIANGLE_DOWN_SLOW +106. ANIM_TRIANGLE_DOWN +107. ANIM_TRIANGLE_DOWN_TWICE +108. ANIM_GROW +109. ANIM_GROW_TWICE +110. ANIM_H_SPRING_FAST +111. ANIM_H_SPRING_SLOW +112. ANIM_H_REPEATED_SPRING_FAST +113. ANIM_H_REPEATED_SPRING +114. ANIM_SHRINK_GROW_FAST +115. ANIM_SHRINK_GROW_SLOW +116. ANIM_V_STRETCH_BOTH_ENDS +117. ANIM_V_STRETCH_BOTH_ENDS_TWICE +118. ANIM_H_STRETCH_FAR_TWICE +119. ANIM_H_STRETCH_FAR +120. ANIM_GROW_STUTTER_TWICE +121. ANIM_GROW_STUTTER +122. ANIM_CONCAVE_ARC_LARGE_SLOW +123. ANIM_CONCAVE_ARC_LARGE +124. ANIM_CONCAVE_ARC_LARGE_TWICE +125. ANIM_CONVEX_DOUBLE_ARC_SLOW +126. ANIM_CONVEX_DOUBLE_ARC +127. ANIM_CONVEX_DOUBLE_ARC_TWICE +128. ANIM_CONCAVE_ARC_SMALL_SLOW +129. ANIM_CONCAVE_ARC_SMALL +130. ANIM_CONCAVE_ARC_SMALL_TWICE +131. ANIM_H_DIP +132. ANIM_H_DIP_FAST +133. ANIM_H_DIP_TWICE +134. ANIM_SHRINK_GROW_VIBRATE_FAST +135. ANIM_SHRINK_GROW_VIBRATE +136. ANIM_SHRINK_GROW_VIBRATE_SLOW +137. ANIM_JOLT_RIGHT_FAST +138. ANIM_JOLT_RIGHT +139. ANIM_JOLT_RIGHT_SLOW +140. ANIM_SHAKE_FLASH_YELLOW_FAST +141. ANIM_SHAKE_FLASH_YELLOW +142. ANIM_SHAKE_FLASH_YELLOW_SLOW +143. ANIM_SHAKE_GLOW_RED_FAST +144. ANIM_SHAKE_GLOW_RED +145. ANIM_SHAKE_GLOW_RED_SLOW +146. ANIM_SHAKE_GLOW_GREEN_FAST +147. ANIM_SHAKE_GLOW_GREEN +148. ANIM_SHAKE_GLOW_GREEN_SLOW +149. ANIM_SHAKE_GLOW_BLUE_FAST +150. ANIM_SHAKE_GLOW_BLUE +151. ANIM_SHAKE_GLOW_BLUE_SLOW + +## Available Back Animations +1. BACK_ANIM_NONE +2. BACK_ANIM_H_VIBRATE +3. BACK_ANIM_H_SLIDE +4. BACK_ANIM_H_SPRING +5. BACK_ANIM_H_SPRING_REPEATED +6. BACK_ANIM_SHRINK_GROW +7. BACK_ANIM_GROW +8. BACK_ANIM_CIRCLE_COUNTERCLOCKWISE +9. BACK_ANIM_H_SHAKE +10. BACK_ANIM_V_SHAKE +11. BACK_ANIM_V_SHAKE_H_SLIDE +12. BACK_ANIM_V_STRETCH +13. BACK_ANIM_H_STRETCH +14. BACK_ANIM_GROW_STUTTER +15. BACK_ANIM_V_SHAKE_LOW +16. BACK_ANIM_TRIANGLE_DOWN +17. BACK_ANIM_CONCAVE_ARC_LARGE +18. BACK_ANIM_CONVEX_DOUBLE_ARC +19. BACK_ANIM_CONCAVE_ARC_SMALL +20. BACK_ANIM_DIP_RIGHT_SIDE +21. BACK_ANIM_SHRINK_GROW_VIBRATE +22. BACK_ANIM_JOLT_RIGHT +23. BACK_ANIM_SHAKE_FLASH_YELLOW +24. BACK_ANIM_SHAKE_GLOW_RED +25. BACK_ANIM_SHAKE_GLOW_GREEN +26. BACK_ANIM_SHAKE_GLOW_BLUE + +## Pokémon ordered by height +| Pokemon | height (m) | +| :------ | ---------: | +| Diglett | 0.2 | +| Natu | 0.2 | +| Azurill | 0.2 | +| Caterpie | 0.3 | +| Weedle | 0.3 | +| Pidgey | 0.3 | +| Rattata | 0.3 | +| Spearow | 0.3 | +| Paras | 0.3 | +| Magnemite | 0.3 | +| Shellder | 0.3 | +| Ditto | 0.3 | +| Eevee | 0.3 | +| Pichu | 0.3 | +| Cleffa | 0.3 | +| Igglybuff | 0.3 | +| Togepi | 0.3 | +| Sunkern | 0.3 | +| Wurmple | 0.3 | +| Taillow | 0.3 | +| Roselia | 0.3 | +| Castform | 0.3 | +| Jirachi | 0.3 | +| Pikachu | 0.4 | +| Nidoran_f | 0.4 | +| Meowth | 0.4 | +| Geodude | 0.4 | +| Krabby | 0.4 | +| Exeggcute | 0.4 | +| Cubone | 0.4 | +| Horsea | 0.4 | +| Omanyte | 0.4 | +| Mew | 0.4 | +| Bellossom | 0.4 | +| Marill | 0.4 | +| Hoppip | 0.4 | +| Wooper | 0.4 | +| Swinub | 0.4 | +| Smoochum | 0.4 | +| Torchic | 0.4 | +| Mudkip | 0.4 | +| Zigzagoon | 0.4 | +| Ralts | 0.4 | +| Shroomish | 0.4 | +| Aron | 0.4 | +| Plusle | 0.4 | +| Minun | 0.4 | +| Gulpin | 0.4 | +| Cacnea | 0.4 | +| Swablu | 0.4 | +| Barboach | 0.4 | +| Clamperl | 0.4 | +| Squirtle | 0.5 | +| Nidoran_m | 0.5 | +| Jigglypuff | 0.5 | +| Oddish | 0.5 | +| Mankey | 0.5 | +| Voltorb | 0.5 | +| Kabuto | 0.5 | +| Cyndaquil | 0.5 | +| Spinarak | 0.5 | +| Chinchou | 0.5 | +| Murkrow | 0.5 | +| Unown | 0.5 | +| Qwilfish | 0.5 | +| Phanpy | 0.5 | +| Treecko | 0.5 | +| Poochyena | 0.5 | +| Linoone | 0.5 | +| Lotad | 0.5 | +| Seedot | 0.5 | +| Surskit | 0.5 | +| Nincada | 0.5 | +| Sableye | 0.5 | +| Torkoal | 0.5 | +| Baltoy | 0.5 | +| Charmander | 0.6 | +| Kakuna | 0.6 | +| Sandshrew | 0.6 | +| Clefairy | 0.6 | +| Vulpix | 0.6 | +| Poliwag | 0.6 | +| Koffing | 0.6 | +| Goldeen | 0.6 | +| Totodile | 0.6 | +| Togetic | 0.6 | +| Mareep | 0.6 | +| Skiploom | 0.6 | +| Pineco | 0.6 | +| Snubbull | 0.6 | +| Shuckle | 0.6 | +| Teddiursa | 0.6 | +| Corsola | 0.6 | +| Remoraid | 0.6 | +| Houndour | 0.6 | +| Porygon2 | 0.6 | +| Elekid | 0.6 | +| Larvitar | 0.6 | +| Celebi | 0.6 | +| Silcoon | 0.6 | +| Wingull | 0.6 | +| Whismur | 0.6 | +| Skitty | 0.6 | +| Mawile | 0.6 | +| Meditite | 0.6 | +| Electrike | 0.6 | +| Illumise | 0.6 | +| Corphish | 0.6 | +| Feebas | 0.6 | +| Shuppet | 0.6 | +| Chimecho | 0.6 | +| Wynaut | 0.6 | +| Luvdisc | 0.6 | +| Bagon | 0.6 | +| Beldum | 0.6 | +| Bulbasaur | 0.7 | +| Metapod | 0.7 | +| Raticate | 0.7 | +| Dugtrio | 0.7 | +| Growlithe | 0.7 | +| Bellsprout | 0.7 | +| Hoothoot | 0.7 | +| Misdreavus | 0.7 | +| Slugma | 0.7 | +| Tyrogue | 0.7 | +| Magby | 0.7 | +| Marshtomp | 0.7 | +| Cascoon | 0.7 | +| Swellow | 0.7 | +| Volbeat | 0.7 | +| Numel | 0.7 | +| Spoink | 0.7 | +| Trapinch | 0.7 | +| Anorith | 0.7 | +| Snorunt | 0.7 | +| Raichu | 0.8 | +| Nidorina | 0.8 | +| Zubat | 0.8 | +| Gloom | 0.8 | +| Psyduck | 0.8 | +| Machop | 0.8 | +| Farfetchd | 0.8 | +| Staryu | 0.8 | +| Jolteon | 0.8 | +| Porygon | 0.8 | +| Sentret | 0.8 | +| Flaaffy | 0.8 | +| Azumarill | 0.8 | +| Jumpluff | 0.8 | +| Aipom | 0.8 | +| Sunflora | 0.8 | +| Magcargo | 0.8 | +| Kirlia | 0.8 | +| Masquerain | 0.8 | +| Slakoth | 0.8 | +| Ninjask | 0.8 | +| Shedinja | 0.8 | +| Carvanha | 0.8 | +| Duskull | 0.8 | +| Spheal | 0.8 | +| Nidorino | 0.9 | +| Abra | 0.9 | +| Tentacool | 0.9 | +| Grimer | 0.9 | +| Magikarp | 0.9 | +| Flareon | 0.9 | +| Chikorita | 0.9 | +| Quilava | 0.9 | +| Espeon | 0.9 | +| Sneasel | 0.9 | +| Octillery | 0.9 | +| Delibird | 0.9 | +| Grovyle | 0.9 | +| Combusken | 0.9 | +| Lairon | 0.9 | +| Grumpig | 0.9 | +| Whiscash | 0.9 | +| Ivysaur | 1.0 | +| Wartortle | 1.0 | +| Beedrill | 1.0 | +| Sandslash | 1.0 | +| Wigglytuff | 1.0 | +| Parasect | 1.0 | +| Venonat | 1.0 | +| Persian | 1.0 | +| Primeape | 1.0 | +| Poliwhirl | 1.0 | +| Weepinbell | 1.0 | +| Graveler | 1.0 | +| Ponyta | 1.0 | +| Magneton | 1.0 | +| Drowzee | 1.0 | +| Marowak | 1.0 | +| Rhyhorn | 1.0 | +| Tangela | 1.0 | +| Vaporeon | 1.0 | +| Omastar | 1.0 | +| Ledyba | 1.0 | +| Umbreon | 1.0 | +| Mightyena | 1.0 | +| Beautifly | 1.0 | +| Nuzleaf | 1.0 | +| Loudred | 1.0 | +| Makuhita | 1.0 | +| Nosepass | 1.0 | +| Lunatone | 1.0 | +| Lileep | 1.0 | +| Kecleon | 1.0 | +| Relicanth | 1.0 | +| Charmeleon | 1.1 | +| Butterfree | 1.1 | +| Pidgeotto | 1.1 | +| Ninetales | 1.1 | +| Seel | 1.1 | +| Chansey | 1.1 | +| Starmie | 1.1 | +| Electabuzz | 1.1 | +| Croconaw | 1.1 | +| Ariados | 1.1 | +| Politoed | 1.1 | +| Gligar | 1.1 | +| Piloswine | 1.1 | +| Donphan | 1.1 | +| Delcatty | 1.1 | +| Spinda | 1.1 | +| Vibrava | 1.1 | +| Altaria | 1.1 | +| Crawdaunt | 1.1 | +| Banette | 1.1 | +| Sealeo | 1.1 | +| Shelgon | 1.1 | +| Fearow | 1.2 | +| Vileplume | 1.2 | +| Slowpoke | 1.2 | +| Muk | 1.2 | +| Electrode | 1.2 | +| Lickitung | 1.2 | +| Weezing | 1.2 | +| Seadra | 1.2 | +| Bayleef | 1.2 | +| Lanturn | 1.2 | +| Sudowoodo | 1.2 | +| Yanma | 1.2 | +| Forretress | 1.2 | +| Smeargle | 1.2 | +| Miltank | 1.2 | +| Pupitar | 1.2 | +| Dustox | 1.2 | +| Lombre | 1.2 | +| Pelipper | 1.2 | +| Breloom | 1.2 | +| Solrock | 1.2 | +| Absol | 1.2 | +| Metang | 1.2 | +| Nidoqueen | 1.3 | +| Clefable | 1.3 | +| Poliwrath | 1.3 | +| Kadabra | 1.3 | +| Gastly | 1.3 | +| Kingler | 1.3 | +| Seaking | 1.3 | +| Mr_mime | 1.3 | +| Magmar | 1.3 | +| Kabutops | 1.3 | +| Wobbuffet | 1.3 | +| Shiftry | 1.3 | +| Medicham | 1.3 | +| Cacturne | 1.3 | +| Zangoose | 1.3 | +| Nidoking | 1.4 | +| Golem | 1.4 | +| Doduo | 1.4 | +| Hitmonchan | 1.4 | +| Jynx | 1.4 | +| Tauros | 1.4 | +| Ledian | 1.4 | +| Ampharos | 1.4 | +| Quagsire | 1.4 | +| Granbull | 1.4 | +| Houndoom | 1.4 | +| Stantler | 1.4 | +| Hitmontop | 1.4 | +| Vigoroth | 1.4 | +| Walrein | 1.4 | +| Latias | 1.4 | +| Pidgeot | 1.5 | +| Venomoth | 1.5 | +| Alakazam | 1.5 | +| Machoke | 1.5 | +| Cloyster | 1.5 | +| Gengar | 1.5 | +| Hitmonlee | 1.5 | +| Scyther | 1.5 | +| Pinsir | 1.5 | +| Xatu | 1.5 | +| Girafarig | 1.5 | +| Dunsparce | 1.5 | +| Heracross | 1.5 | +| Blissey | 1.5 | +| Swampert | 1.5 | +| Ludicolo | 1.5 | +| Exploud | 1.5 | +| Manectric | 1.5 | +| Claydol | 1.5 | +| Cradily | 1.5 | +| Armaldo | 1.5 | +| Glalie | 1.5 | +| Salamence | 1.5 | +| Blastoise | 1.6 | +| Golbat | 1.6 | +| Machamp | 1.6 | +| Tentacruel | 1.6 | +| Slowbro | 1.6 | +| Haunter | 1.6 | +| Hypno | 1.6 | +| Zapdos | 1.6 | +| Noctowl | 1.6 | +| Gardevoir | 1.6 | +| Dusclops | 1.6 | +| Metagross | 1.6 | +| Charizard | 1.7 | +| Golduck | 1.7 | +| Victreebel | 1.7 | +| Rapidash | 1.7 | +| Dewgong | 1.7 | +| Articuno | 1.7 | +| Typhlosion | 1.7 | +| Skarmory | 1.7 | +| Sceptile | 1.7 | +| Swalot | 1.7 | +| Huntail | 1.7 | +| Regirock | 1.7 | +| Deoxys | 1.7 | +| Dodrio | 1.8 | +| Aerodactyl | 1.8 | +| Dratini | 1.8 | +| Meganium | 1.8 | +| Furret | 1.8 | +| Crobat | 1.8 | +| Scizor | 1.8 | +| Ursaring | 1.8 | +| Kingdra | 1.8 | +| Sharpedo | 1.8 | +| Gorebyss | 1.8 | +| Regice | 1.8 | +| Arcanine | 1.9 | +| Rhydon | 1.9 | +| Raikou | 1.9 | +| Blaziken | 1.9 | +| Camerupt | 1.9 | +| Registeel | 1.9 | +| Venusaur | 2.0 | +| Ekans | 2.0 | +| Exeggutor | 2.0 | +| Moltres | 2.0 | +| Mewtwo | 2.0 | +| Slowking | 2.0 | +| Suicune | 2.0 | +| Tyranitar | 2.0 | +| Slaking | 2.0 | +| Wailmer | 2.0 | +| Flygon | 2.0 | +| Tropius | 2.0 | +| Latios | 2.0 | +| Snorlax | 2.1 | +| Mantine | 2.1 | +| Entei | 2.1 | +| Aggron | 2.1 | +| Kangaskhan | 2.2 | +| Dragonite | 2.2 | +| Feraligatr | 2.3 | +| Hariyama | 2.3 | +| Lapras | 2.5 | +| Seviper | 2.7 | +| Arbok | 3.5 | +| Groudon | 3.5 | +| Ho_oh | 3.8 | +| Dragonair | 4.0 | +| Kyogre | 4.5 | +| Lugia | 5.2 | +| Milotic | 6.2 | +| Gyarados | 6.5 | +| Rayquaza | 7.0 | +| Onix | 8.8 | +| Steelix | 9.2 | +| Wailord | 14.5 | + +## Pokémon ordered by weight +| Pokemon | weight (kg) | +| :------ | ----------: | +| Gastly | 0.1 | +| Haunter | 0.1 | +| Hoppip | 0.5 | +| Diglett | 0.8 | +| Castform | 0.8 | +| Igglybuff | 1.0 | +| Koffing | 1.0 | +| Skiploom | 1.0 | +| Chimecho | 1.0 | +| Misdreavus | 1.0 | +| Jirachi | 1.1 | +| Swablu | 1.2 | +| Shedinja | 1.2 | +| Togepi | 1.5 | +| Surskit | 1.7 | +| Pidgey | 1.8 | +| Sunkern | 1.8 | +| Barboach | 1.9 | +| Natu | 2.0 | +| Azurill | 2.0 | +| Spearow | 2.0 | +| Pichu | 2.0 | +| Roselia | 2.0 | +| Murkrow | 2.1 | +| Taillow | 2.3 | +| Shuppet | 2.3 | +| Exeggcute | 2.5 | +| Torchic | 2.5 | +| Lotad | 2.6 | +| Caterpie | 2.9 | +| Cleffa | 3.0 | +| Jumpluff | 3.0 | +| Weedle | 3.2 | +| Togetic | 3.2 | +| Dratini | 3.3 | +| Rattata | 3.5 | +| Wurmple | 3.6 | +| Masquerain | 3.6 | +| Qwilfish | 3.9 | +| Shellder | 4.0 | +| Ditto | 4.0 | +| Mew | 4.0 | +| Seedot | 4.0 | +| Bellsprout | 4.0 | +| Meowth | 4.2 | +| Plusle | 4.2 | +| Minun | 4.2 | +| Shroomish | 4.5 | +| Unown | 5.0 | +| Treecko | 5.0 | +| Corsola | 5.0 | +| Celebi | 5.0 | +| Spinda | 5.0 | +| Paras | 5.4 | +| Oddish | 5.4 | +| Jigglypuff | 5.5 | +| Nincada | 5.5 | +| Bellossom | 5.8 | +| Magnemite | 6.0 | +| Pikachu | 6.0 | +| Smoochum | 6.0 | +| Sentret | 6.0 | +| Chikorita | 6.4 | +| Weepinbell | 6.4 | +| Eevee | 6.5 | +| Krabby | 6.5 | +| Cubone | 6.5 | +| Swinub | 6.5 | +| Ralts | 6.6 | +| Bulbasaur | 6.9 | +| Ekans | 6.9 | +| Nidoran_f | 7.0 | +| Pineco | 7.2 | +| Feebas | 7.4 | +| Omanyte | 7.5 | +| Clefairy | 7.5 | +| Zubat | 7.5 | +| Mudkip | 7.6 | +| Mareep | 7.8 | +| Snubbull | 7.8 | +| Cyndaquil | 7.9 | +| Horsea | 8.0 | +| Marill | 8.5 | +| Wooper | 8.5 | +| Spinarak | 8.5 | +| Charmander | 8.5 | +| Sunflora | 8.5 | +| Gloom | 8.6 | +| Luvdisc | 8.7 | +| Teddiursa | 8.8 | +| Squirtle | 9.0 | +| Nidoran_m | 9.0 | +| Totodile | 9.5 | +| Wingull | 9.5 | +| Weezing | 9.5 | +| Vulpix | 9.9 | +| Metapod | 9.9 | +| Kakuna | 10.0 | +| Silcoon | 10.0 | +| Magikarp | 10.0 | +| Gulpin | 10.3 | +| Voltorb | 10.4 | +| Houndour | 10.8 | +| Ledyba | 10.8 | +| Sableye | 11.0 | +| Skitty | 11.0 | +| Meditite | 11.2 | +| Kabuto | 11.5 | +| Mawile | 11.5 | +| Corphish | 11.5 | +| Cascoon | 11.5 | +| Aipom | 11.5 | +| Chinchou | 12.0 | +| Sandshrew | 12.0 | +| Remoraid | 12.0 | +| Ninjask | 12.0 | +| Wigglytuff | 12.0 | +| Poliwag | 12.4 | +| Anorith | 12.5 | +| Banette | 12.5 | +| Venomoth | 12.5 | +| Ivysaur | 13.0 | +| Flaaffy | 13.3 | +| Poochyena | 13.6 | +| Wynaut | 14.0 | +| Dunsparce | 14.0 | +| Goldeen | 15.0 | +| Trapinch | 15.0 | +| Farfetchd | 15.0 | +| Duskull | 15.0 | +| Xatu | 15.0 | +| Electrike | 15.2 | +| Vibrava | 15.3 | +| Victreebel | 15.5 | +| Bayleef | 15.8 | +| Delibird | 16.0 | +| Whismur | 16.3 | +| Dragonair | 16.5 | +| Snorunt | 16.8 | +| Zigzagoon | 17.5 | +| Illumise | 17.7 | +| Volbeat | 17.7 | +| Raticate | 18.5 | +| Vileplume | 18.6 | +| Growlithe | 19.0 | +| Quilava | 19.0 | +| Charmeleon | 19.0 | +| Machop | 19.5 | +| Nidorino | 19.5 | +| Abra | 19.5 | +| Combusken | 19.5 | +| Psyduck | 19.6 | +| Swellow | 19.8 | +| Ninetales | 19.9 | +| Geodude | 20.0 | +| Nidorina | 20.0 | +| Poliwhirl | 20.0 | +| Kirlia | 20.2 | +| Shuckle | 20.5 | +| Altaria | 20.6 | +| Carvanha | 20.8 | +| Tyrogue | 21.0 | +| Hoothoot | 21.2 | +| Magby | 21.4 | +| Baltoy | 21.5 | +| Grovyle | 21.6 | +| Kecleon | 22.0 | +| Wartortle | 22.5 | +| Lanturn | 22.5 | +| Gorebyss | 22.6 | +| Relicanth | 23.4 | +| Elekid | 23.5 | +| Whiscash | 23.6 | +| Lileep | 23.8 | +| Numel | 24.0 | +| Slakoth | 24.0 | +| Jolteon | 24.5 | +| Flareon | 25.0 | +| Croconaw | 25.0 | +| Seadra | 25.0 | +| Espeon | 26.5 | +| Umbreon | 27.0 | +| Huntail | 27.0 | +| Mankey | 28.0 | +| Marshtomp | 28.0 | +| Sneasel | 28.0 | +| Nuzleaf | 28.0 | +| Pelipper | 28.0 | +| Beautifly | 28.4 | +| Azumarill | 28.5 | +| Octillery | 28.5 | +| Wobbuffet | 28.5 | +| Vaporeon | 29.0 | +| Beedrill | 29.5 | +| Sandslash | 29.5 | +| Parasect | 29.5 | +| Raichu | 30.0 | +| Grimer | 30.0 | +| Venonat | 30.0 | +| Ponyta | 30.0 | +| Pidgeotto | 30.0 | +| Electabuzz | 30.0 | +| Muk | 30.0 | +| Spoink | 30.6 | +| Dusclops | 30.6 | +| Medicham | 31.5 | +| Dustox | 31.6 | +| Persian | 32.0 | +| Primeape | 32.0 | +| Butterfree | 32.0 | +| Drowzee | 32.4 | +| Linoone | 32.5 | +| Porygon2 | 32.5 | +| Lombre | 32.5 | +| Furret | 32.5 | +| Delcatty | 32.6 | +| Crawdaunt | 32.8 | +| Dugtrio | 33.3 | +| Phanpy | 33.5 | +| Ariados | 33.5 | +| Politoed | 33.9 | +| Staryu | 34.5 | +| Chansey | 34.6 | +| Slugma | 35.0 | +| Tangela | 35.0 | +| Omastar | 35.0 | +| Houndoom | 35.0 | +| Ledian | 35.6 | +| Slowpoke | 36.0 | +| Porygon | 36.5 | +| Mightyena | 37.0 | +| Fearow | 38.0 | +| Sudowoodo | 38.0 | +| Yanma | 38.0 | +| Seaking | 39.0 | +| Breloom | 39.2 | +| Doduo | 39.2 | +| Spheal | 39.5 | +| Pidgeot | 39.5 | +| Clefable | 40.0 | +| Latias | 40.0 | +| Manectric | 40.2 | +| Zangoose | 40.3 | +| Loudred | 40.5 | +| Kabutops | 40.5 | +| Gengar | 40.5 | +| Jynx | 40.6 | +| Noctowl | 40.8 | +| Girafarig | 41.5 | +| Bagon | 42.1 | +| Magmar | 44.5 | +| Marowak | 45.0 | +| Tentacool | 45.5 | +| Vigoroth | 46.5 | +| Blissey | 46.8 | +| Absol | 47.0 | +| Hitmontop | 48.0 | +| Alakazam | 48.0 | +| Gardevoir | 48.4 | +| Granbull | 48.7 | +| Hitmonlee | 49.8 | +| Hitmonchan | 50.2 | +| Skarmory | 50.5 | +| Cacnea | 51.3 | +| Blaziken | 52.0 | +| Sceptile | 52.2 | +| Clamperl | 52.5 | +| Seviper | 52.5 | +| Zapdos | 52.6 | +| Poliwrath | 54.0 | +| Heracross | 54.0 | +| Mr_mime | 54.5 | +| Magcargo | 55.0 | +| Pinsir | 55.0 | +| Ludicolo | 55.0 | +| Golbat | 55.0 | +| Tentacruel | 55.0 | +| Articuno | 55.4 | +| Piloswine | 55.8 | +| Scyther | 56.0 | +| Kadabra | 56.5 | +| Smeargle | 58.0 | +| Aerodactyl | 59.0 | +| Shiftry | 59.6 | +| Aron | 60.0 | +| Magneton | 60.0 | +| Nidoqueen | 60.0 | +| Kingler | 60.0 | +| Moltres | 60.0 | +| Latios | 60.0 | +| Cradily | 60.4 | +| Deoxys | 60.8 | +| Ampharos | 61.5 | +| Nidoking | 62.0 | +| Gligar | 64.8 | +| Arbok | 65.0 | +| Lickitung | 65.5 | +| Electrode | 66.6 | +| Armaldo | 68.2 | +| Machoke | 70.5 | +| Stantler | 71.2 | +| Grumpig | 71.5 | +| Larvitar | 72.0 | +| Quagsire | 75.0 | +| Crobat | 75.0 | +| Miltank | 75.5 | +| Hypno | 75.6 | +| Golduck | 76.6 | +| Cacturne | 77.4 | +| Slowbro | 78.5 | +| Typhlosion | 79.5 | +| Slowking | 79.5 | +| Starmie | 80.0 | +| Swalot | 80.0 | +| Kangaskhan | 80.0 | +| Torkoal | 80.4 | +| Swampert | 81.9 | +| Flygon | 82.0 | +| Exploud | 84.0 | +| Dodrio | 85.2 | +| Blastoise | 85.5 | +| Makuhita | 86.4 | +| Sealeo | 87.6 | +| Tauros | 88.4 | +| Sharpedo | 88.8 | +| Feraligatr | 88.8 | +| Seel | 90.0 | +| Charizard | 90.5 | +| Rapidash | 95.0 | +| Beldum | 95.2 | +| Nosepass | 97.0 | +| Venusaur | 100.0 | +| Tropius | 100.0 | +| Meganium | 100.5 | +| Salamence | 102.6 | +| Graveler | 105.0 | +| Claydol | 108.0 | +| Shelgon | 110.5 | +| Rhyhorn | 115.0 | +| Scizor | 118.0 | +| Lairon | 120.0 | +| Donphan | 120.0 | +| Dewgong | 120.0 | +| Rhydon | 120.0 | +| Exeggutor | 120.0 | +| Mewtwo | 122.0 | +| Forretress | 125.8 | +| Ursaring | 125.8 | +| Machamp | 130.0 | +| Wailmer | 130.0 | +| Slaking | 130.5 | +| Cloyster | 132.5 | +| Walrein | 150.6 | +| Pupitar | 152.0 | +| Kingdra | 152.0 | +| Solrock | 154.0 | +| Arcanine | 155.0 | +| Milotic | 162.0 | +| Lunatone | 168.0 | +| Regice | 175.0 | +| Raikou | 178.0 | +| Suicune | 187.0 | +| Entei | 198.0 | +| Ho_oh | 199.0 | +| Tyranitar | 202.0 | +| Metang | 202.5 | +| Registeel | 205.0 | +| Rayquaza | 206.5 | +| Dragonite | 210.0 | +| Onix | 210.0 | +| Lugia | 216.0 | +| Camerupt | 220.0 | +| Mantine | 220.0 | +| Lapras | 220.0 | +| Regirock | 230.0 | +| Gyarados | 235.0 | +| Hariyama | 253.8 | +| Glalie | 256.5 | +| Golem | 300.0 | +| Kyogre | 352.0 | +| Aggron | 360.0 | +| Wailord | 398.0 | +| Steelix | 400.0 | +| Snorlax | 460.0 | +| Metagross | 550.0 | +| Groudon | 950.0 | + +## Making this easier +If you have multiple species that you want to add to pokeemerald but don't want to copy and paste or type everything out multiple times, just use this handy program to generate text with the species name in there! +https://github.com/smithk200/making-a-new-pokemon-species-in-pokeemerald diff --git a/docs/how_to_new_pokemon_1_7_0.md b/docs/how_to_new_pokemon_1_7_0.md new file mode 100644 index 0000000000..801ae8e549 --- /dev/null +++ b/docs/how_to_new_pokemon_1_7_0.md @@ -0,0 +1,1049 @@ + +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to 1.7.x versions. +- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) +- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) +- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. +* You have 6 icon palettes available instead of the base 3. +* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. + +# Content +* [Useful resources](#useful-resources) +* [The Data - Part 1](#the-data---part-1) + * [1. Declare a species constant](#1-Declare-a-species-constant) + * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) + * [3. Define its basic species information](#3-define-its-basic-species-information) + * [4. Species Name](#4-species-name) + * [5. Define its cry](#5-define-its-cry) + * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) + * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) + * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) +* [The Data - Part 2](#the-data---part-2) + * [1. Species Flags](#1-species-flags) + * [2. Delimit the moveset](#2-delimit-the-moveset) + * [3. Define the Evolutions](#3-define-the-evolutions) + * [4. Make it appear!](#4-make-it-appear) +* [Optional data](#optional-data) + * [1. Form tables](#1-form-tables) + * [2. Form change tables](#2-form-change-tables) + * [3. Gender differences](#3-gender-differences) + +# Useful resources +You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. + +![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) + + +# The Data - Part 1 + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_EEVEE_PARTNER PLACEHOLDER_START + 54 ++#define SPECIES_MEWTHREE PLACEHOLDER_START + 55 + +-#define GIGANTAMAX_START SPECIES_EEVEE_PARTNER ++#define GIGANTAMAX_START SPECIES_MEWTHREE + + // Gigantamax Forms + #define SPECIES_VENUSAUR_GIGANTAMAX GIGANTAMAX_START + 1 +``` +This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. + +We add this before Gigantamax forms because they're temporary forms that shouldn't normally be saved into a Pokémon's save structure. + +Now, let's see how it looks in-game! + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) + +Hmmm, something's not right... + +Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. + +Now, let's see what needs to be done. + +## 2. `SpeciesInfo`'s structure +Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data. +```diff + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 64, + #endif + .evYield_HP = 3, + .itemCommon = ITEM_LUM_BERRY, + .itemRare = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, + .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PINK, + .isMythical = TRUE, + .speciesName = _("Mew"), + .cryId = CRY_MEW, + .natDexNum = NATIONAL_DEX_MEW, + .categoryName = _("New Species"), + .height = 4, + .weight = 40, + .description = COMPOUND_STRING( + "A Mew is said to possess the genes of all\n" + "Pokémon. It is capable of making itself\n" + "invisible at will, so it entirely avoids\n" + "notice even if it approaches people."), + .pokemonScale = 457, + .pokemonOffset = -2, + .trainerScale = 256, + .trainerOffset = 0, + FRONT_PIC(Mew, 64, 48), + .frontPicYOffset = 9, + .frontAnimFrames = sAnims_Mew, + .frontAnimId = ANIM_ZIGZAG_SLOW, + .enemyMonElevation = 11, + BACK_PIC(Mew, 64, 64), + .backPicYOffset = 0, + .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, + PALETTES(Mew), + ICON(Mew, 0), + FOOTPRINT(Mew) + LEARNSETS(Mew), + }, +``` + +That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial +(and miles better than having this same data through 20+ files like it used to be). + +We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: + +## 3. Define its basic species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_EGG] = + { + FRONT_PIC(Egg, 24, 24), + .frontPicYOffset = 20, + .backPic = gMonFrontPic_Egg, + .backPicSize = MON_COORDS_SIZE(24, 24), + .backPicYOffset = 20, + .palette = gMonPalette_Egg, + .shinyPalette = gMonPalette_Egg, + ICON(Egg, 1), + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, ++ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, ++ .bodyColor = BODY_COLOR_PURPLE, ++ }, + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. +- You may be confused as to why `types` has `TYPE_PSYCHIC` twice. This is because the way the game determines single-type mon is to define both types the same. + - If we don't, it defaults to Normal due to it being the first type defined. +- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. +- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) + - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. +- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) + - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D +- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. + - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) + - If they're both set as the same item, the item has a 100% chance of appearing. +- `genderRatio` is a fun one. + - There are 4 ways of handling this + - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. + - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) + - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) + - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. + - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. + - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! +- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. +- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. +- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. +- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. +- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). + - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. + - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) + - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. + - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. +- `bodyColor` is used in the Pokédex as a search filter. +- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. + +That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. + +## 4. Species Name + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, ++ .speciesName = _("Mewthree"), + }, + }; +``` +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 5. Define its cry + +Time for audio! +We first need to convert an existing audio file to the format supported by the expansion. + +Most formats are supported for conversion, but for simplicity's sake, we're gonna use this [mp3 file](https://cdn.discordapp.com/attachments/1206424179197349924/1206424212403920996/mewthree.mp3?ex=6600df1a&is=65ee6a1a&hm=4f05d58a7ae22bfdcd5f83558e15320fc1b6cd42a8cb9dee347b20bfb805ece5&). + +Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. +Once that's done, let's run the following command: +``` +ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif +``` +This will convert your audio file to .aif, which is what's read by the compiler. + +Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff +.if P_FAMILY_PECHARUNT == TRUE + .align 2 +Cry_Pecharunt:: + .incbin "sound/direct_sound_samples/cries/pecharunt.bin" +.endif @ P_FAMILY_PECHARUNT + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +``` + +Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): + +```diff +enum { + CRY_NONE, + ... +#if P_FAMILY_TERAPAGOS + CRY_TERAPAGOS, +#endif //P_FAMILY_TERAPAGOS +#if P_FAMILY_PECHARUNT + CRY_PECHARUNT, +#endif //P_FAMILY_PECHARUNT ++ CRY_MEWTHREE, + CRY_COUNT, +}; +``` + +And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. + +```diff + cry Cry_Terapagos + cry Cry_Pecharunt ++ cry Cry_Mewthree +``` +```diff + cry_reverse Cry_Terapagos + cry_reverse Cry_Pecharunt ++ cry_reverse Cry_Mewthree +``` + +Lastly, we add the cry to our species entry +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, + .speciesName = _("Mewthree"), ++ .cryId = CRY_MEWTHREE, + }, + }; +``` + +And let's see how it sounds in-game: + +https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 + +Good! Our monster now has a mighty roar! + +You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. + +## 6. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_PECHARUNT, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI + +#if P_GEN_9_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +}; + +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can add the number and entry to our Mewthree: +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .cryId = CRY_MEWTHREE, ++ .natDexNum = NATIONAL_DEX_MEWTHREE, ++ .categoryName = _("New Species"), ++ .height = 15, ++ .weight = 330, ++ .description = COMPOUND_STRING( ++ "The rumors became true.\n" ++ "This is Mew's final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"), ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, + }, + }; +``` +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. + +`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + // 72.8 lbs / 33.0 kg + //NATIONAL_DEX_MEWTWO_MEGA_Y, + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN_ALOLAN, + NATIONAL_DEX_TOEDSCOOL, + // 73.4 lbs / 33.3 kg + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + // 4'11" / 1.5m + ... + NATIONAL_DEX_GLIMMORA, + NATIONAL_DEX_WO_CHIEN, + NATIONAL_DEX_IRON_LEAVES, + NATIONAL_DEX_IRON_BOULDER, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` +![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) + + +# The Graphics +We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. +```sh +cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree +``` +We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. + +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. + +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ + +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. Notice, that the icon will use one of 6 predefined palettes instead of `normal.pal`. + +## 2. Add the sprites to the rom +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff +#if P_FAMILY_PECHARUNT + // const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + // const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + // const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + // const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + // const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); +#if P_FOOTPRINTS + // const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); +#endif //P_FOOTPRINTS +#endif //P_FAMILY_PECHARUNT + ++ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); ++ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); ++ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); ++ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); ++ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. + +It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing. + +## 3. Add the animations to the rom + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +#if P_FAMILY_PECHARUNT +PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); +#endif //P_FAMILY_PECHARUNT + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +``` + +```diff +#if P_FAMILY_PECHARUNT +SINGLE_ANIMATION(Pecharunt); +#endif //P_FAMILY_PECHARUNT ++SINGLE_ANIMATION(Mewthree); +SINGLE_ANIMATION(Egg); +``` + +You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: +```c +static const union AnimCmd sAnim_Pecharunt_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +} +``` +Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): +```c +#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ +static const union AnimCmd sAnim_##name##_1[] = \ +{ \ + ANIMCMD_FRAME(0, 1), \ + ANIMCMD_END, \ +} +``` + +## 4. Linking graphic information to our Pokémon +Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, ++ FRONT_PIC(Mewthree, 64, 64), ++ .frontPicYOffset = 0, ++ .frontAnimFrames = sAnims_Mewthree, ++ .frontAnimId = ANIM_GROW_VIBRATE, ++ .frontAnimDelay = 15, ++ .enemyMonElevation = 6, ++ BACK_PIC(Mewthree, 64, 64), ++ .backPicYOffset = 0, ++ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, ++ PALETTES(Mewthree), ++ ICON(Mewthree, 2), ++ FOOTPRINT(Mewthree) + }, + }; +``` +Let's explain each of these: +- `FRONT_PIC`: + - This is a macro handles both the `frontPic` and `frontPicSize` fields. + ```c + #define FRONT_PIC(sprite, width, height) \ + .frontPic = gMonFrontPic_## sprite, \ + .frontPicSize = MON_COORDS_SIZE(width, height) + ``` + - The first value in the macro is used to reference the front sprite, so in this case, using `Mewthree` will call for `gMonFrontPic_Mewthree`. + - The second and third values (`width` and `height`) are used for defining the non-empty size of the sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `frontPicYOffset`: + - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. +- `frontAnimFrames`: + - We link our animation frame animations that we defined earlier here. +- `frontAnimId`: + - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. +- `frontAnimDelay`: + - Sets a delay in frame count between when the Pokémon appears and when the animation starts. +- `enemyMonElevation`: + - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. +- `BACK_PIC`: + - A macro like `FRONT_PIC` except for the back sprite handling the `frontPic` and `frontPicSize` fields in the same way. + ```c + #define BACK_PIC(sprite, width, height) \ + .backPic = gMonBackPic_## sprite, \ + .backPicSize = MON_COORDS_SIZE(width, height) + ``` +- `backPicYOffset`: + - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. +- `backAnimId`: + - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. +- `PALETTES` + - This macro was created to handle both regular and shiny palettes of a Pokémon. It just needs the species suffix to call the corresponding palette. + ```c + #define PALETTES(pal) \ + .palette = gMonPalette_## pal, \ + .shinyPalette = gMonShinyPalette_## pal + ``` +- `ICON` + - This macro is calls both the icon sprite and its palette. + ```c + #define ICON(sprite, palId) \ + .iconSprite = gMonIcon_## sprite, \ + .iconPalIndex = palId + ``` + Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. + + Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. +- `FOOTPRINT` + - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). + ```c + #if P_FOOTPRINTS + #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, + #else + #define FOOTPRINT(sprite) + #endif + ``` + +# The Data - Part 2 + +We're almost there just a bit left! + +## 1. Species Flags + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PURPLE, ++ .isLegendary = TRUE, ++ .allPerfectIVs = TRUE, + }, + }; +``` +Each species flag provides properties to the species: +- `isLegendary`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). +- `isMythical`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). + - Is skipped during Pokédex evaluations. + - Unless it also has the `dexForceRequired` flag. + - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. +- `isUltraBeast`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). + - Beast Ball's multiplier is set to x5 for this species. + - All other ball multipliers are set to x0.1. +- `isParadoxForm`: + - Currently has no functionality but can be utilized by users for their own benefits. +- `isMegaEvolution`: + - A Mega indicator is added to the battle box indicating that they're Mega Evolved. + - The species doesn't receive affection benefits. + - Required when adding new Mega Evolutions. +- `isPrimalReversion`: + - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. + - Required when adding new Primal Reversions. +- `isUltraBurst`: + - Required when adding new Ultra Burst forms. +- `isGigantamax`: + - Used to determine if Gigantamax forms should have their GMax moves or not. + - Required when adding new Gigantamax forms. +- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: + - In the future, these will be used to determine breeding offspring from different based on their region. +- `cannotBeTraded`: + - This species cannot be traded away (like Black/White Kyurem). +- `allPerfectIVs`: + - Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee). +- `tmIlliterate`: + - This species will be unable to learn the universal moves. + +*: As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher. + +## 2. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), + LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), + LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), + LEVEL_UP_MOVE(56, MOVE_TOXIC), + LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(72, MOVE_RECOVER), + LEVEL_UP_END +}; +#endif + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ 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 ++}; +``` + +Again, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + PALETTES(Mewthree), + ICON(Mewthree, 2), + FOOTPRINT(Mewthree) ++ .levelUpLearnset = sMewthreeLevelUpLearnset, + }, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const u16 sPecharuntTeachableLearnset[] = { + ... + MOVE_UNAVAILABLE, +}; +#endif //P_FAMILY_PECHARUNT + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ MOVE_HIDDEN_POWER, ++ MOVE_SUNNY_DAY, ++ MOVE_TAUNT, ++ MOVE_ICE_BEAM, ++ MOVE_BLIZZARD, ++ MOVE_HYPER_BEAM, ++ MOVE_LIGHT_SCREEN, ++ MOVE_PROTECT, ++ MOVE_RAIN_DANCE, ++ MOVE_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, // This is required to determine where the array ends. ++}; +#endif +``` + +Once more, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) + .levelUpLearnset = sMewthreeLevelUpLearnset, ++ .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + + +## 3. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTWO] = + { + ... + FOOTPRINT(Mewtwo) + .isLegendary = TRUE, + .levelUpLearnset = sMewtwoLevelUpLearnset, + .teachableLearnset = sMewtwoTeachableLearnset, + .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, + .formChangeTable = sMewtwoFormChangeTable, ++ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), + }, + }; +``` + +## 4. Make it appear! +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Optional data + +Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. + +## 1. Form tables +Found in `src/data/pokemon/form_species_tables.h`. + +These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: +```c +#if P_FAMILY_PIKACHU +static const u16 sPikachuFormSpeciesIdTable[] = { + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL_CAP, + SPECIES_PIKACHU_HOENN_CAP, + SPECIES_PIKACHU_SINNOH_CAP, + SPECIES_PIKACHU_UNOVA_CAP, + SPECIES_PIKACHU_KALOS_CAP, + SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_PARTNER_CAP, + SPECIES_PIKACHU_WORLD_CAP, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_PIKACHU +``` +We register the table each form entry in `gSpeciesInfo`. + +```diff + [SPECIES_PIKACHU] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + }, + + [SPECIES_PIKACHU_COSPLAY] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + }, +``` +...and so on. + +What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. + +For example, in the HGSS dex, it lets us browse between the entries of every form available.: + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) + +In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: +```c + case HOLD_EFFECT_LIGHT_BALL: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + break; +``` + +## 2. Form change tables +Found in `src/data/pokemon/form_species_tables.h`. + +These tables, unlike the regular form tables, registers how Pokémon can switch between forms. + +```c +#if P_FAMILY_GASTLY +static const struct FormChange sGengarFormChangeTable[] = { + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_GASTLY +``` +The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. + +The second value is the target form, to which the Pokémon will change into. + +Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. + +## 3. Gender differences +![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) + +You may have seen that there's a couple of duplicate fields with a "Female" suffix. +```diff + [SPECIES_FRILLISH] = + { + ... + .frontPic = gMonFrontPic_Frillish, ++ .frontPicFemale = gMonFrontPic_FrillishF, + .frontPicSize = MON_COORDS_SIZE(56, 56), ++ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), + .frontPicYOffset = 5, + .frontAnimFrames = sAnims_Frillish, + .frontAnimId = ANIM_RISING_WOBBLE, + .backPic = gMonBackPic_Frillish, ++ .backPicFemale = gMonBackPic_FrillishF, + .backPicSize = MON_COORDS_SIZE(40, 56), ++ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), + .backPicYOffset = 7, + .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, + .palette = gMonPalette_Frillish, ++ .paletteFemale = gMonPalette_FrillishF, + .shinyPalette = gMonShinyPalette_Frillish, ++ .shinyPaletteFemale = gMonShinyPalette_FrillishF, + .iconSprite = gMonIcon_Frillish, ++ .iconSpriteFemale = gMonIcon_FrillishF, + .iconPalIndex = 0, ++ .iconPalIndexFemale = 1, + FOOTPRINT(Frillish) + .levelUpLearnset = sFrillishLevelUpLearnset, + .teachableLearnset = sFrillishTeachableLearnset, + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), + }, +``` +These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. + +However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. + diff --git a/docs/how_to_new_pokemon_1_8_0.md b/docs/how_to_new_pokemon_1_8_0.md new file mode 100644 index 0000000000..c4c7ab621c --- /dev/null +++ b/docs/how_to_new_pokemon_1_8_0.md @@ -0,0 +1,1049 @@ + +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to 1.8.x versions. +- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) +- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) +- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. +* You have 6 icon palettes available instead of the base 3. +* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. + +# Content +* [Useful resources](#useful-resources) +* [The Data - Part 1](#the-data---part-1) + * [1. Declare a species constant](#1-Declare-a-species-constant) + * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) + * [3. Define its basic species information](#3-define-its-basic-species-information) + * [4. Species Name](#4-species-name) + * [5. Define its cry](#5-define-its-cry) + * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) + * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) + * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) +* [The Data - Part 2](#the-data---part-2) + * [1. Species Flags](#1-species-flags) + * [2. Delimit the moveset](#2-delimit-the-moveset) + * [3. Define the Evolutions](#3-define-the-evolutions) + * [4. Make it appear!](#4-make-it-appear) +* [Optional data](#optional-data) + * [1. Form tables](#1-form-tables) + * [2. Form change tables](#2-form-change-tables) + * [3. Gender differences](#3-gender-differences) + +# Useful resources +You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. + +![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) + + +# The Data - Part 1 + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX 1521 + #define SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX 1522 + #define SPECIES_MIMIKYU_TOTEM_BUSTED 1523 ++#define SPECIES_MEWTHREE 1524 + +-#define SPECIES_EGG SPECIES_MIMIKYU_TOTEM_BUSTED + 1 ++#define SPECIES_EGG SPECIES_MEWTHREE + 1 + + #define NUM_SPECIES SPECIES_EGG +``` +This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. + +We add this after the last species ID and make sure to update `SPECIES_EGG`'s definition to use the last ID on the list. +Also, be sure that no IDs repeat each other, or you'll get compiling errors. + +``` +NOTE: In 1.7.x and previous versions, we had variable defines such as `FORMS_START` but was confusing for users, so we switched to absolute IDs. +``` + +Now, let's see how it looks in-game! + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) + +Hmmm, something's not right... + +Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. + +Now, let's see what needs to be done. + +## 2. `SpeciesInfo`'s structure +Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data. +```diff + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 64, + #endif + .evYield_HP = 3, + .itemCommon = ITEM_LUM_BERRY, + .itemRare = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, + .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PINK, + .isMythical = TRUE, + .speciesName = _("Mew"), + .cryId = CRY_MEW, + .natDexNum = NATIONAL_DEX_MEW, + .categoryName = _("New Species"), + .height = 4, + .weight = 40, + .description = COMPOUND_STRING( + "A Mew is said to possess the genes of all\n" + "Pokémon. It is capable of making itself\n" + "invisible at will, so it entirely avoids\n" + "notice even if it approaches people."), + .pokemonScale = 457, + .pokemonOffset = -2, + .trainerScale = 256, + .trainerOffset = 0, + .frontPic = gMonFrontPic_Mew, + .frontPicSize = MON_COORDS_SIZE(64, 48), + .frontPicYOffset = 9, + .frontAnimFrames = sAnims_Mew, + .frontAnimId = ANIM_ZIGZAG_SLOW, + .enemyMonElevation = 11, + .backPic = gMonBackPic_Mew, + .backPicSize = MON_COORDS_SIZE(64, 64), + .backPicYOffset = 0, + .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, + .palette = gMonPalette_Mew, + .shinyPalette = gMonShinyPalette_Mew, + .iconSprite = gMonIcon_Mew, + .iconPalIndex = 0, + FOOTPRINT(Mew) + .levelUpLearnset = sMewLevelUpLearnset, + .teachableLearnset = sMewTeachableLearnset, + }, +``` + +That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial +(and miles better than having this same data through 20+ files like it used to be). + +We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: + +## 3. Define its basic species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_EGG] = + { + FRONT_PIC(Egg, 24, 24), + .frontPicYOffset = 20, + .backPic = gMonFrontPic_Egg, + .backPicSize = MON_COORDS_SIZE(24, 24), + .backPicYOffset = 20, + .palette = gMonPalette_Egg, + .shinyPalette = gMonPalette_Egg, + ICON(Egg, 1), + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, ++ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, ++ .bodyColor = BODY_COLOR_PURPLE, ++ }, + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. +- You may be confused as to why `types` has `TYPE_PSYCHIC` twice. This is because the way the game determines single-type mon is to define both types the same. + - If we don't, it defaults to Normal due to it being the first type defined. +- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. +- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) + - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. +- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) + - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D +- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. + - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) + - If they're both set as the same item, the item has a 100% chance of appearing. +- `genderRatio` is a fun one. + - There are 4 ways of handling this + - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. + - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) + - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) + - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. + - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. + - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! +- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. +- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. +- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. +- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. +- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). + - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. + - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) + - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. + - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. +- `bodyColor` is used in the Pokédex as a search filter. +- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. + +That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. + +## 4. Species Name + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, ++ .speciesName = _("Mewthree"), + }, + }; +``` +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 5. Define its cry + +Time for audio! +We first need to convert an existing audio file to the format supported by the expansion. + +Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file. + +Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. +Once that's done, let's run the following command: +``` +ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif +``` +This will convert your audio file to .aif, which is what's read by the compiler. + +Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff +.if P_FAMILY_PECHARUNT == TRUE + .align 2 +Cry_Pecharunt:: + .incbin "sound/direct_sound_samples/cries/pecharunt.bin" +.endif @ P_FAMILY_PECHARUNT + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +``` + +Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): + +```diff +enum { + CRY_NONE, + ... +#if P_FAMILY_TERAPAGOS + CRY_TERAPAGOS, +#endif //P_FAMILY_TERAPAGOS +#if P_FAMILY_PECHARUNT + CRY_PECHARUNT, +#endif //P_FAMILY_PECHARUNT ++ CRY_MEWTHREE, + CRY_COUNT, +}; +``` + +And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. + +```diff + cry Cry_Terapagos + cry Cry_Pecharunt ++ cry Cry_Mewthree +``` +```diff + cry_reverse Cry_Terapagos + cry_reverse Cry_Pecharunt ++ cry_reverse Cry_Mewthree +``` + +Lastly, we add the cry to our species entry +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, + .speciesName = _("Mewthree"), ++ .cryId = CRY_MEWTHREE, + }, + }; +``` + +And let's see how it sounds in-game: + +https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 + +Good! Our monster now has a mighty roar! + +You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. + +## 6. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_PECHARUNT, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI + +#if P_GEN_9_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +}; + +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can add the number and entry to our Mewthree: +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .cryId = CRY_MEWTHREE, ++ .natDexNum = NATIONAL_DEX_MEWTHREE, ++ .categoryName = _("New Species"), ++ .height = 15, ++ .weight = 330, ++ .description = COMPOUND_STRING( ++ "The rumors became true.\n" ++ "This is Mew's final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"), ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, + }, + }; +``` +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. + +`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + // 72.8 lbs / 33.0 kg + //NATIONAL_DEX_MEWTWO_MEGA_Y, + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN_ALOLAN, + NATIONAL_DEX_TOEDSCOOL, + // 73.4 lbs / 33.3 kg + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + // 4'11" / 1.5m + ... + NATIONAL_DEX_GLIMMORA, + NATIONAL_DEX_WO_CHIEN, + NATIONAL_DEX_IRON_LEAVES, + NATIONAL_DEX_IRON_BOULDER, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` +![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) + + +# The Graphics +We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. +```sh +cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree +``` +We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. + +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. + +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ + +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. Notice, that the icon will use one of 6 predefined palettes instead of `normal.pal`. + +## 2. Add the sprites to the rom +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff +#if P_FAMILY_PECHARUNT + // const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + // const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + // const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + // const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + // const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); +#if P_FOOTPRINTS + // const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); +#endif //P_FOOTPRINTS +#endif //P_FAMILY_PECHARUNT + ++ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); ++ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); ++ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); ++ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); ++ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. + +It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing. + +## 3. Add the animations to the rom + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +#if P_FAMILY_PECHARUNT +PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); +#endif //P_FAMILY_PECHARUNT + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +``` + +```diff +#if P_FAMILY_PECHARUNT +SINGLE_ANIMATION(Pecharunt); +#endif //P_FAMILY_PECHARUNT ++SINGLE_ANIMATION(Mewthree); +SINGLE_ANIMATION(Egg); +``` + +You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: +```c +static const union AnimCmd sAnim_Pecharunt_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +} +``` +Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): +```c +#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ +static const union AnimCmd sAnim_##name##_1[] = \ +{ \ + ANIMCMD_FRAME(0, 1), \ + ANIMCMD_END, \ +} +``` + +## 4. Linking graphic information to our Pokémon +Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, ++ .frontPic = gMonFrontPic_Mewthree, ++ .frontPicSize = MON_COORDS_SIZE(64, 64), ++ .frontPicYOffset = 0, ++ .frontAnimFrames = sAnims_Mewthree, ++ .frontAnimId = ANIM_GROW_VIBRATE, ++ .frontAnimDelay = 15, ++ .enemyMonElevation = 6, ++ .backPic = gMonBackPic_Mewthree, ++ .backPicSize = MON_COORDS_SIZE(64, 64), ++ .backPicYOffset = 0, ++ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, ++ .palette = gMonPalette_Mewthree, ++ .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ FOOTPRINT(Mewthree) + }, + }; +``` +Let's explain each of these: +- `frontPic`: + - Used to reference the front sprite, so in this case, we call for `gMonFrontPic_Mewthree`. +- `frontPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `frontPicYOffset`: + - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. +- `frontAnimFrames`: + - We link our animation frame animations that we defined earlier here. +- `frontAnimId`: + - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. +- `frontAnimDelay`: + - Sets a delay in frame count between when the Pokémon appears and when the animation starts. +- `enemyMonElevation`: + - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. +- `backPic`: + - Used to reference the back sprite, so in this case, we call for `gMonBackPic_Mewthree`. +- `backPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `backPicYOffset`: + - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. +- `backAnimId`: + - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. +- `palette`: + - Used to reference the non-shiny palette, so in this case, we call for `gMonPalette_Mewthree`. +- `shinyPalette`: + - Used to reference the shiny palette, so in this case, we call for `gMonShinyPalette_Mewthree`. +- `iconSprite`: + - Used to reference the icon sprite, so in this case, we call for `gMonIcon_Mewthree`. +- `iconPalIndex`: +- `ICON` + - Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. + + Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. +- `FOOTPRINT` + - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). + ```c + #if P_FOOTPRINTS + #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, + #else + #define FOOTPRINT(sprite) + #endif + ``` + +# The Data - Part 2 + +We're almost there just a bit left! + +## 1. Species Flags + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PURPLE, ++ .isLegendary = TRUE, ++ .allPerfectIVs = TRUE, + }, + }; +``` +Each species flag provides properties to the species: +- `isLegendary`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). +- `isMythical`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). + - Is skipped during Pokédex evaluations. + - Unless it also has the `dexForceRequired` flag. + - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. +- `isUltraBeast`: + - Guarantees 3 perfect IVs upon generating the Pokémon[*](########## "As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher"). + - Beast Ball's multiplier is set to x5 for this species. + - All other ball multipliers are set to x0.1. +- `isParadoxForm`: + - Currently has no functionality but can be utilized by users for their own benefits. +- `isMegaEvolution`: + - A Mega indicator is added to the battle box indicating that they're Mega Evolved. + - The species doesn't receive affection benefits. + - Required when adding new Mega Evolutions. +- `isPrimalReversion`: + - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. + - Required when adding new Primal Reversions. +- `isUltraBurst`: + - Required when adding new Ultra Burst forms. +- `isGigantamax`: + - Used to determine if Gigantamax forms should have their GMax moves or not. + - Required when adding new Gigantamax forms. +- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: + - In the future, these will be used to determine breeding offspring from different based on their region. +- `cannotBeTraded`: + - This species cannot be traded away (like Black/White Kyurem). +- `allPerfectIVs`: + - Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee). +- `tmIlliterate`: + - This species will be unable to learn the universal moves. + +*: As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher. + +## 2. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), + LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), + LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), + LEVEL_UP_MOVE(56, MOVE_TOXIC), + LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(72, MOVE_RECOVER), + LEVEL_UP_END +}; +#endif + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ 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 ++}; +``` + +Again, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + PALETTES(Mewthree), + ICON(Mewthree, 2), + FOOTPRINT(Mewthree) ++ .levelUpLearnset = sMewthreeLevelUpLearnset, + }, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const u16 sPecharuntTeachableLearnset[] = { + ... + MOVE_UNAVAILABLE, +}; +#endif //P_FAMILY_PECHARUNT + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ MOVE_HIDDEN_POWER, ++ MOVE_SUNNY_DAY, ++ MOVE_TAUNT, ++ MOVE_ICE_BEAM, ++ MOVE_BLIZZARD, ++ MOVE_HYPER_BEAM, ++ MOVE_LIGHT_SCREEN, ++ MOVE_PROTECT, ++ MOVE_RAIN_DANCE, ++ MOVE_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, // This is required to determine where the array ends. ++}; +#endif +``` + +Once more, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) + .levelUpLearnset = sMewthreeLevelUpLearnset, ++ .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + + +## 3. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTWO] = + { + ... + FOOTPRINT(Mewtwo) + .isLegendary = TRUE, + .levelUpLearnset = sMewtwoLevelUpLearnset, + .teachableLearnset = sMewtwoTeachableLearnset, + .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, + .formChangeTable = sMewtwoFormChangeTable, ++ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), + }, + }; +``` + +## 4. Make it appear! +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Optional data + +Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. + +## 1. Form tables +Found in `src/data/pokemon/form_species_tables.h`. + +These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: +```c +#if P_FAMILY_PIKACHU +static const u16 sPikachuFormSpeciesIdTable[] = { + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL_CAP, + SPECIES_PIKACHU_HOENN_CAP, + SPECIES_PIKACHU_SINNOH_CAP, + SPECIES_PIKACHU_UNOVA_CAP, + SPECIES_PIKACHU_KALOS_CAP, + SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_PARTNER_CAP, + SPECIES_PIKACHU_WORLD_CAP, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_PIKACHU +``` +We register the table each form entry in `gSpeciesInfo`. + +```diff + [SPECIES_PIKACHU] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + }, + + [SPECIES_PIKACHU_COSPLAY] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + }, +``` +...and so on. + +What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. + +For example, in the HGSS dex, it lets us browse between the entries of every form available.: + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) + +In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: +```c + case HOLD_EFFECT_LIGHT_BALL: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + break; +``` + +## 2. Form change tables +Found in `src/data/pokemon/form_species_tables.h`. + +These tables, unlike the regular form tables, registers how Pokémon can switch between forms. + +```c +#if P_FAMILY_GASTLY +static const struct FormChange sGengarFormChangeTable[] = { + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_GASTLY +``` +The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. + +The second value is the target form, to which the Pokémon will change into. + +Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. + +## 3. Gender differences +![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) + +You may have seen that there's a couple of duplicate fields with a "Female" suffix. +```diff + [SPECIES_FRILLISH] = + { + ... + .frontPic = gMonFrontPic_Frillish, ++ .frontPicFemale = gMonFrontPic_FrillishF, + .frontPicSize = MON_COORDS_SIZE(56, 56), ++ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), + .frontPicYOffset = 5, + .frontAnimFrames = sAnims_Frillish, + .frontAnimId = ANIM_RISING_WOBBLE, + .backPic = gMonBackPic_Frillish, ++ .backPicFemale = gMonBackPic_FrillishF, + .backPicSize = MON_COORDS_SIZE(40, 56), ++ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), + .backPicYOffset = 7, + .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, + .palette = gMonPalette_Frillish, ++ .paletteFemale = gMonPalette_FrillishF, + .shinyPalette = gMonShinyPalette_Frillish, ++ .shinyPaletteFemale = gMonShinyPalette_FrillishF, + .iconSprite = gMonIcon_Frillish, ++ .iconSpriteFemale = gMonIcon_FrillishF, + .iconPalIndex = 0, ++ .iconPalIndexFemale = 1, + FOOTPRINT(Frillish) + .levelUpLearnset = sFrillishLevelUpLearnset, + .teachableLearnset = sFrillishTeachableLearnset, + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), + }, +``` +These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. + +However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. diff --git a/docs/how_to_new_pokemon_1_9_0.md b/docs/how_to_new_pokemon_1_9_0.md new file mode 100644 index 0000000000..84742c3a76 --- /dev/null +++ b/docs/how_to_new_pokemon_1_9_0.md @@ -0,0 +1,1139 @@ + +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to 1.9.x versions. +- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) +- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) +- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. +* You have 6 icon palettes available instead of the base 3. +* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. + +# Content +* [Useful resources](#useful-resources) +* [The Data - Part 1](#the-data---part-1) + * [1. Declare a species constant](#1-Declare-a-species-constant) + * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) + * [3. Define its basic species information](#3-define-its-basic-species-information) + * [4. Species Name](#4-species-name) + * [5. Define its cry](#5-define-its-cry) + * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) + * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) + * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) +* [The Data - Part 2](#the-data---part-2) + * [1. Species Flags](#1-species-flags) + * [2. Delimit the moveset](#2-delimit-the-moveset) + * [3. Define the Evolutions](#3-define-the-evolutions) + * [4. Make it appear!](#4-make-it-appear) +* [Optional data](#optional-data) + * [1. Form tables](#1-form-tables) + * [2. Form change tables](#2-form-change-tables) + * [3. Gender differences](#3-gender-differences) + * [4. Overworld Data](#4-overworld-data) + +# Useful resources +You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. + +![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) + + +# The Data - Part 1 + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_EEVEE_PARTNER PLACEHOLDER_START + 54 ++#define SPECIES_MEWTHREE PLACEHOLDER_START + 55 + +-#define GIGANTAMAX_START SPECIES_EEVEE_PARTNER ++#define GIGANTAMAX_START SPECIES_MEWTHREE + + // Gigantamax Forms + #define SPECIES_VENUSAUR_GIGANTAMAX GIGANTAMAX_START + 1 +``` +This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. + +We add this before Gigantamax forms because they're temporary forms that shouldn't normally be saved into a Pokémon's save structure. + +Now, let's see how it looks in-game! + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) + +Hmmm, something's not right... + +Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. + +Now, let's see what needs to be done. + +## 2. `SpeciesInfo`'s structure +Now, to better understand Mewtwo, we also need to understand Mew. Let's look at its data. +```diff + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 64, + #endif + .evYield_HP = 3, + .itemCommon = ITEM_LUM_BERRY, + .itemRare = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, + .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PINK, + .isMythical = TRUE, + .speciesName = _("Mew"), + .cryId = CRY_MEW, + .natDexNum = NATIONAL_DEX_MEW, + .categoryName = _("New Species"), + .height = 4, + .weight = 40, + .description = COMPOUND_STRING( + "A Mew is said to possess the genes of all\n" + "Pokémon. It is capable of making itself\n" + "invisible at will, so it entirely avoids\n" + "notice even if it approaches people."), + .pokemonScale = 457, + .pokemonOffset = -2, + .trainerScale = 256, + .trainerOffset = 0, + .frontPic = gMonFrontPic_Mew, + .frontPicSize = MON_COORDS_SIZE(64, 48), + .frontPicYOffset = 9, + .frontAnimFrames = sAnims_Mew, + .frontAnimId = ANIM_ZIGZAG_SLOW, + .enemyMonElevation = 11, + .backPic = gMonBackPic_Mew, + .backPicSize = MON_COORDS_SIZE(64, 64), + .backPicYOffset = 0, + .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, + .palette = gMonPalette_Mew, + .shinyPalette = gMonShinyPalette_Mew, + .iconSprite = gMonIcon_Mew, + .iconPalIndex = 0, + FOOTPRINT(Mew) + .levelUpLearnset = sMewLevelUpLearnset, + .teachableLearnset = sMewTeachableLearnset, + }, +``` + +That's a lot of stuff! But don't worry, we'll go through it step by step throught the tutorial +(and miles better than having this same data through 20+ files like it used to be). + +We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: + +## 3. Define its basic species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_EGG] = + { + FRONT_PIC(Egg, 24, 24), + .frontPicYOffset = 20, + .backPic = gMonFrontPic_Egg, + .backPicSize = MON_COORDS_SIZE(24, 24), + .backPicYOffset = 20, + .palette = gMonPalette_Egg, + .shinyPalette = gMonPalette_Egg, + ICON(Egg, 1), + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = { TYPE_PSYCHIC, TYPE_PSYCHIC }, ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, ++ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, ++ .bodyColor = BODY_COLOR_PURPLE, ++ }, + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. +- You may be confused as to why `types` has `TYPE_PSYCHIC` twice. This is because the way the game determines single-type mon is to define both types the same. + - If we don't, it defaults to Normal due to it being the first type defined. +- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. +- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) + - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. +- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) + - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D +- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. + - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Grass or Super Luck) + - If they're both set as the same item, the item has a 100% chance of appearing. +- `genderRatio` is a fun one. + - There are 4 ways of handling this + - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. + - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) + - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) + - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. + - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. + - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! +- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. +- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. +- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. +- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. +- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). + - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. + - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) + - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. + - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. +- `bodyColor` is used in the Pokédex as a search filter. +- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. + +That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. + +## 4. Species Name + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, ++ .speciesName = _("Mewthree"), + }, + }; +``` +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 5. Define its cry + +Time for audio! +We first need to convert an existing audio file to the format supported by the expansion. + +Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file. + +Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. +Once that's done, let's run the following command: +``` +ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif +``` +This will convert your audio file to .aif, which is what's read by the compiler. + +Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff +.if P_FAMILY_PECHARUNT == TRUE + .align 2 +Cry_Pecharunt:: + .incbin "sound/direct_sound_samples/cries/pecharunt.bin" +.endif @ P_FAMILY_PECHARUNT + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +``` + +Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): + +```diff +enum { + CRY_NONE, + ... +#if P_FAMILY_TERAPAGOS + CRY_TERAPAGOS, +#endif //P_FAMILY_TERAPAGOS +#if P_FAMILY_PECHARUNT + CRY_PECHARUNT, +#endif //P_FAMILY_PECHARUNT ++ CRY_MEWTHREE, + CRY_COUNT, +}; +``` + +And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. + +```diff + cry Cry_Terapagos + cry Cry_Pecharunt ++ cry Cry_Mewthree +``` +```diff + cry_reverse Cry_Terapagos + cry_reverse Cry_Pecharunt ++ cry_reverse Cry_Mewthree +``` + +Lastly, we add the cry to our species entry +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .isLegendary = TRUE, + .allPerfectIVs = TRUE, + .speciesName = _("Mewthree"), ++ .cryId = CRY_MEWTHREE, + }, + }; +``` + +And let's see how it sounds in-game: + +https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 + +Good! Our monster now has a mighty roar! + +You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. + +## 6. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_PECHARUNT, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI + +#if P_GEN_9_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +}; + +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can add the number and entry to our Mewthree: +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .cryId = CRY_MEWTHREE, ++ .natDexNum = NATIONAL_DEX_MEWTHREE, ++ .categoryName = _("New Species"), ++ .height = 15, ++ .weight = 330, ++ .description = COMPOUND_STRING( ++ "The rumors became true.\n" ++ "This is Mew's final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"), ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, + }, + }; +``` +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. + +`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + // 72.8 lbs / 33.0 kg + //NATIONAL_DEX_MEWTWO_MEGA_Y, + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN_ALOLAN, + NATIONAL_DEX_TOEDSCOOL, + // 73.4 lbs / 33.3 kg + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + // 4'11" / 1.5m + ... + NATIONAL_DEX_GLIMMORA, + NATIONAL_DEX_WO_CHIEN, + NATIONAL_DEX_IRON_LEAVES, + NATIONAL_DEX_IRON_BOULDER, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` +![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) + + +# The Graphics +We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. +```sh +cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree +``` +We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. + +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. + +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ + +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. Notice, that the icon will use one of 6 predefined palettes instead of `normal.pal`. + +## 2. Add the sprites to the rom +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff +#if P_FAMILY_PECHARUNT + // const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + // const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + // const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + // const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + // const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); +#if P_FOOTPRINTS + // const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); +#endif //P_FOOTPRINTS +#endif //P_FAMILY_PECHARUNT + ++ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); ++ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); ++ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); ++ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); ++ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. + +It is also worth to mention that Pecharunt's sprites are commented out simply because they're currently missing. + +## 3. Add the animations to the rom + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +#if P_FAMILY_PECHARUNT +PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); +#endif //P_FAMILY_PECHARUNT + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +``` + +```diff +#if P_FAMILY_PECHARUNT +SINGLE_ANIMATION(Pecharunt); +#endif //P_FAMILY_PECHARUNT ++SINGLE_ANIMATION(Mewthree); +SINGLE_ANIMATION(Egg); +``` + +You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: +```c +static const union AnimCmd sAnim_Pecharunt_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +} +``` +Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): +```c +#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ +static const union AnimCmd sAnim_##name##_1[] = \ +{ \ + ANIMCMD_FRAME(0, 1), \ + ANIMCMD_END, \ +} +``` + +## 4. Linking graphic information to our Pokémon +Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, ++ .frontPic = gMonFrontPic_Mewthree, ++ .frontPicSize = MON_COORDS_SIZE(64, 64), ++ .frontPicYOffset = 0, ++ .frontAnimFrames = sAnims_Mewthree, ++ .frontAnimId = ANIM_GROW_VIBRATE, ++ .frontAnimDelay = 15, ++ .enemyMonElevation = 6, ++ .backPic = gMonBackPic_Mewthree, ++ .backPicSize = MON_COORDS_SIZE(64, 64), ++ .backPicYOffset = 0, ++ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, ++ .palette = gMonPalette_Mewthree, ++ .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ FOOTPRINT(Mewthree) + }, + }; +``` +Let's explain each of these: +- `frontPic`: + - Used to reference the front sprite, so in this case, we call for `gMonFrontPic_Mewthree`. +- `frontPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `frontPicYOffset`: + - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. +- `frontAnimFrames`: + - We link our animation frame animations that we defined earlier here. +- `frontAnimId`: + - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. +- `frontAnimDelay`: + - Sets a delay in frame count between when the Pokémon appears and when the animation starts. +- `enemyMonElevation`: + - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. +- `backPic`: + - Used to reference the back sprite, so in this case, we call for `gMonBackPic_Mewthree`. +- `backPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `backPicYOffset`: + - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. +- `backAnimId`: + - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. +- `palette`: + - Used to reference the non-shiny palette, so in this case, we call for `gMonPalette_Mewthree`. +- `shinyPalette`: + - Used to reference the shiny palette, so in this case, we call for `gMonShinyPalette_Mewthree`. +- `iconSprite`: + - Used to reference the icon sprite, so in this case, we call for `gMonIcon_Mewthree`. +- `iconPalIndex`: +- `ICON` + - Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. + + Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. +- `FOOTPRINT` + - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). + ```c + #if P_FOOTPRINTS + #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, + #else + #define FOOTPRINT(sprite) + #endif + ``` + +# The Data - Part 2 + +We're almost there just a bit left! + +## 1. Species Flags + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PURPLE, ++ .isLegendary = TRUE, ++ .allPerfectIVs = TRUE, + }, + }; +``` +Each species flag provides properties to the species: +- `isLegendary`: + - Guarantees 3 perfect IVs upon generating the Pokémon (As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher). +- `isMythical`: + - Guarantees 3 perfect IVs upon generating the Pokémon (As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher). + - Is skipped during Pokédex evaluations. + - Unless it also has the `dexForceRequired` flag. + - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. +- `isUltraBeast`: + - Guarantees 3 perfect IVs upon generating the Pokémon (As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher). + - Beast Ball's multiplier is set to x5 for this species. + - All other ball multipliers are set to x0.1. +- `isParadox` (previously `isParadoxForm`): + - Currently has no functionality but can be utilized by users for their own benefits. +- `isTotem`: + - Guarantees 3 perfect IVs upon generating the Pokémon (As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher). +- `isMegaEvolution`: + - A Mega indicator is added to the battle box indicating that they're Mega Evolved. + - The species doesn't receive affection benefits. + - Required when adding new Mega Evolutions. +- `isPrimalReversion`: + - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. + - Required when adding new Primal Reversions. +- `isUltraBurst`: + - Required when adding new Ultra Burst forms. +- `isGigantamax`: + - Used to determine if Gigantamax forms should have their GMax moves or not. + - Required when adding new Gigantamax forms. +- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: + - In the future, these will be used to determine breeding offspring from different based on their region. +- `cannotBeTraded`: + - This species cannot be traded away (like Black/White Kyurem). +- `allPerfectIVs`: + - Guarantees 6 perfect IVs upon generating the Pokémon (like LGPE's Partner Pikachu and Eevee). +- `tmIlliterate`: + - This species will be unable to learn the universal moves. +- `isFrontierBanned`: + - This species will be unable to enter Battle Frontier facilities. Replaces `gFrontierBannedSpecies`. + +*: As long as `P_LEGENDARY_PERFECT_IVS` is set to `GEN_6` or higher. + +## 2. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), + LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), + LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), + LEVEL_UP_MOVE(56, MOVE_TOXIC), + LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(72, MOVE_RECOVER), + LEVEL_UP_END +}; +#endif + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ 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 ++}; +``` + +Again, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + PALETTES(Mewthree), + ICON(Mewthree, 2), + FOOTPRINT(Mewthree) ++ .levelUpLearnset = sMewthreeLevelUpLearnset, + }, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const u16 sPecharuntTeachableLearnset[] = { + ... + MOVE_UNAVAILABLE, +}; +#endif //P_FAMILY_PECHARUNT + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ MOVE_HIDDEN_POWER, ++ MOVE_SUNNY_DAY, ++ MOVE_TAUNT, ++ MOVE_ICE_BEAM, ++ MOVE_BLIZZARD, ++ MOVE_HYPER_BEAM, ++ MOVE_LIGHT_SCREEN, ++ MOVE_PROTECT, ++ MOVE_RAIN_DANCE, ++ MOVE_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, // This is required to determine where the array ends. ++}; +#endif +``` + +Once more, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) + .levelUpLearnset = sMewthreeLevelUpLearnset, ++ .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + + +## 3. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTWO] = + { + ... + FOOTPRINT(Mewtwo) + .isLegendary = TRUE, + .levelUpLearnset = sMewtwoLevelUpLearnset, + .teachableLearnset = sMewtwoTeachableLearnset, + .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, + .formChangeTable = sMewtwoFormChangeTable, ++ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), + }, + }; +``` + +## 4. Make it appear! +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Optional data + +Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. + +## 1. Form tables +Found in `src/data/pokemon/form_species_tables.h`. + +These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: +```c +#if P_FAMILY_PIKACHU +static const u16 sPikachuFormSpeciesIdTable[] = { + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL_CAP, + SPECIES_PIKACHU_HOENN_CAP, + SPECIES_PIKACHU_SINNOH_CAP, + SPECIES_PIKACHU_UNOVA_CAP, + SPECIES_PIKACHU_KALOS_CAP, + SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_PARTNER_CAP, + SPECIES_PIKACHU_WORLD_CAP, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_PIKACHU +``` +We register the table each form entry in `gSpeciesInfo`. + +```diff + [SPECIES_PIKACHU] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + }, + + [SPECIES_PIKACHU_COSPLAY] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + }, +``` +...and so on. + +What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. + +For example, in the HGSS dex, it lets us browse between the entries of every form available.: + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) + +In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: +```c + case HOLD_EFFECT_LIGHT_BALL: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + break; +``` + +## 2. Form change tables +Found in `src/data/pokemon/form_species_tables.h`. + +These tables, unlike the regular form tables, registers how Pokémon can switch between forms. + +```c +#if P_FAMILY_GASTLY +static const struct FormChange sGengarFormChangeTable[] = { + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_GASTLY +``` +The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. + +The second value is the target form, to which the Pokémon will change into. + +Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. + +## 3. Gender differences +![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) + +You may have seen that there's a couple of duplicate fields with a "Female" suffix. +```diff + [SPECIES_FRILLISH] = + { + ... + .frontPic = gMonFrontPic_Frillish, ++ .frontPicFemale = gMonFrontPic_FrillishF, + .frontPicSize = MON_COORDS_SIZE(56, 56), ++ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), + .frontPicYOffset = 5, + .frontAnimFrames = sAnims_Frillish, + .frontAnimId = ANIM_RISING_WOBBLE, + .backPic = gMonBackPic_Frillish, ++ .backPicFemale = gMonBackPic_FrillishF, + .backPicSize = MON_COORDS_SIZE(40, 56), ++ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), + .backPicYOffset = 7, + .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, + .palette = gMonPalette_Frillish, ++ .paletteFemale = gMonPalette_FrillishF, + .shinyPalette = gMonShinyPalette_Frillish, ++ .shinyPaletteFemale = gMonShinyPalette_FrillishF, + .iconSprite = gMonIcon_Frillish, ++ .iconSpriteFemale = gMonIcon_FrillishF, + .iconPalIndex = 0, ++ .iconPalIndexFemale = 1, + FOOTPRINT(Frillish) + .levelUpLearnset = sFrillishLevelUpLearnset, + .teachableLearnset = sFrillishTeachableLearnset, + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), + }, +``` +These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. + +However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. + +## 4. Overworld Data +![mGBA_4iqvhhSltK](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/e59238dc-9779-4f26-a9e7-159a32caa3d9) + +If you have `OW_POKEMON_OBJECT_EVENTS` in your hack, you can add Overworld of your new species by following these steps: + +First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes + +Secondly, in [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h), add the following: + +```diff + const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); + const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); ++ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp"); ++ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz"); ++ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz"); +``` + +Thirdly, in [spritesheet_rules.mk](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/spritesheet_rules.mk) + +```diff +$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + ++$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png ++ $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 +``` + +Fourthly, in [src/data/object_events/object_event_pic_tables_followers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/object_events/object_event_pic_tables_followers.h): +```diff +#if P_FAMILY_PECHARUNT +/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = { + overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4), +};*/ +#endif //P_FAMILY_PECHARUNT + ++static const struct SpriteFrameImage sPicTable_Mewthree[] = { ++ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4), ++}; +``` + +And finally, in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) ++ OVERWORLD( ++ sPicTable_Mewthree, ++ SIZE_32x32, ++ SHADOW_SIZE_M, ++ TRACKS_FOOT, ++ gOverworldPalette_Mewthree, ++ gShinyOverworldPalette_Mewthree ++ ) + .levelUpLearnset = sMewthreeLevelUpLearnset, + .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +### Sprite Size +Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have `SIZE_64x64` in their data instead of `SIZE_32x32` to accomodate for them. + +Also, in `spritesheet_rules.mk`, `-mwidth` and `-mheight` need to be set to 8 instead of 4 for such cases. + +### Shadows +You have 4 options for their shadow, between Small, Medium, Large and None: + - `SHADOW_SIZE_NONE` + - `SHADOW_SIZE_S` ![shadow_small](https://github.com/user-attachments/assets/c964712e-f5cb-42e8-82fa-db33fc4f4d4c) + - `SHADOW_SIZE_M` ![shadow_medium](https://github.com/user-attachments/assets/b7792624-d65c-425b-9982-cab28ce4248e) + - `SHADOW_SIZE_L` ![shadow_large](https://github.com/user-attachments/assets/ec2dc701-d335-44ad-8ded-f8003114f0ff) + +### Tracks +You have 4 options for the tracks that your species will leave behind on sand. + - `TRACKS_NONE` + - `TRACKS_FOOT` ![sand_footprints](https://github.com/user-attachments/assets/8b8c34d6-72e9-4b9d-839d-0a5cc1ae1a4c) + - `TRACKS_SLITHER` ![slither_tracks](https://github.com/user-attachments/assets/28219c05-61e0-48b3-9aeb-43f48e4ffdd4) + - `TRACKS_SPOT` ![spot_tracks](https://github.com/user-attachments/assets/f7a24887-c5ca-47f2-8825-01f3df61deca) + - `TRACKS_BUG` ![bug_tracks](https://github.com/user-attachments/assets/8cd1dea4-4123-4af8-a558-992874a6d589) + + ...though technically you can also use `TRACKS_BIKE_TIRE` if you wish to. + +![bike_tire_tracks](https://github.com/user-attachments/assets/ac81d211-85e5-443a-ac54-c2976f1f0b82) diff --git a/docs/how_to_testing_system.md b/docs/how_to_testing_system.md new file mode 100644 index 0000000000..793465114c --- /dev/null +++ b/docs/how_to_testing_system.md @@ -0,0 +1,578 @@ +# How to use the Testing System + +## Running Tests +To run all the tests use: +`make check -j` +To run specific tests, e.g. Spikes ones, use: +`make check TESTS='Spikes'` +To build a ROM (pokemerald-test.elf) that can be opened in mgba to view specific tests, e.g. Spikes ones, use: +`make pokeemerald-test.elf TESTS='Spikes'` + +## How to Write Tests +Manually testing a battle mechanic often follows this pattern: +1. Create a party which can activate the mechanic. +2. Start a battle and play a few turns which activate the mechanic. +3. Look at the UI outputs to decide if the mechanic works. + +Automated testing follows the same pattern: +1. Initialize the party in `GIVEN`. +2. Play the turns in `WHEN`. +3. Check the UI outputs in `SCENE`. + +### Example 1 +As a concrete example, to manually test `EFFECT_PARALYZE`, e.g. the +effect of Stun Spore you might: +1. Put a Wobbuffet that knows Stun Spore in your party. +2. Battle a wild Wobbuffet. +3. Use Stun Spore. +4. Check that the Wobbuffet is paralyzed. + +This can be translated to an automated test as follows: + +``` +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); +} + +SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); // 1. + OPPONENT(SPECIES_WOBBUFFET); // 2. + } WHEN { + TURN { MOVE(player, MOVE_STUN_SPORE); } // 3. + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); // 4 + STATUS_ICON(opponent, paralysis: TRUE); // 4. + } +} +``` + +The `ASSUMPTIONS` block documents that Stun Spore has `EFFECT_PARALYZE`. +If Stun Spore did not have that effect it would cause the tests in the file to be skipped. We write our tests like this so that hackers can change the effects of moves without causing tests to fail. + +`SINGLE_BATTLE_TEST` defines the name of the test. Related tests should start with the same prefix, e.g. Stun Spore tests should start with "Stun Spore", this allows just the Stun Spore-related tests to be run with: +`make check TESTS='Stun Spore'` + +`GIVEN` initializes the parties, `PLAYER` and `OPPONENT` add a Pokémon to their respective parties. They can both accept a block which further customizes the Pokémon's stats, moves, item, ability, etc. + +`WHEN` describes the turns, and `TURN` describes the choices made in a single turn. `MOVE` causes the player to use Stun Spore and adds the move to the Pokémon's moveset if an explicit Moves was not specified. +Pokémon that are not mentioned in a `TURN` use Celebrate. +The test runner rigs the RNG so that unless otherwise specified, moves always hit, never critical hit, always activate their secondary effects, and always roll the same damage modifier. + +`SCENE` describes the player-visible output of the battle. In this case `ANIMATION` checks that the Stun Spore animation played, `MESSAGE` checks the paralysis message was shown, and `STATUS_ICON` checks that the opponent's HP bar shows a PRZ icon. + +### Example 2 +As a second example, to manually test that Stun Spore does not effect Grass-types you might: +1. Put a Wobbuffet that knows Stun Spore in your party. +2. Battle a wild Oddish. +3. Use Stun Spore. +4. Check that the move animation does not play. +5. Check that a "It doesn't affect Foe Oddish…" message is shown. + +This can again be translated as follows: + +``` +SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + PLAYER(SPECIES_ODDISH); // 1. + OPPONENT(SPECIES_ODDISH); // 2. + } WHEN { + TURN { MOVE(player, MOVE_STUN_SPORE); } // 3. + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player); // 4. + MESSAGE("It doesn't affect Foe Oddish…"); // 5. + } +} +``` +The `ASSUME` commands are documenting the reasons why Stun Spore does not affect Oddish, namely that Stun Spore is a powder move, and Oddish is a Grass-type. These `ASSUME` statements function similarly to the ones in `ASSUMPTIONS` but apply only to the one test. +NOT inverts the meaning of a `SCENE` check, so applying it to `ANIMATION` requires that the Stun Spore animation does not play. `MESSAGE` checks that the message was shown. +The checks in `SCENE` are ordered, so together this says "The doesn't affect message is shown, and the Stun Spore animation does not play at any time before that". Normally you would only test one or the other, or even better, just `NOT STATUS_ICON(opponent, paralysis: TRUE);` to say that Oddish was not paralyzed without specifying the exact outputs which led to that. + +### Example 3 +As a final example, to test that Meditate works you might: +1. Put a Wobbuffet that knows Meditate and Tackle in your party. +2. Battle a wild Wobbuffet. +3. Use Tackle and note the amount the HP bar reduced. +4. Battle a wild Wobbuffet. +5. Use Meditate and that the stat change animation and message play. +6. Use Tackle and check that the HP bar reduced by more than in 3. + +This can be translated to an automated test as follows: +``` +SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage) +{ + bool32 raiseAttack; + PARAMETRIZE { raiseAttack = FALSE; } + PARAMETRIZE { raiseAttack = TRUE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (raiseAttack) TURN { MOVE(player, MOVE_MEDITATE); } // 5. + TURN { MOVE(player, MOVE_TACKLE); } // 3 & 6. + } SCENE { + if (raiseAttack) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEDITATE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); // 5. + MESSAGE("Wobbuffet's attack rose!"); // 5. + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); // 3 & 6. + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); // 6. + } +} +``` + +`PARAMETRIZE` causes a test to run multiple times, once per `PARAMETRIZE` block (e.g. once with `raiseAttack = FALSE` and once with `raiseAttack = TRUE`). +The `HP_BAR` command's `captureDamage` causes the change in HP to be stored in a variable, and the variable chosen is `results[i].damage`. +`results[i]` contains all the variables defined at the end of `SINGLE_BATTLE_TEST`, `i` is the current `PARAMETRIZE` index. +`FINALLY` runs after the last parameter has finished, and uses `EXPECT_MUL_EQ` to check that the second battle deals 1.5× the damage of the first battle (with a small tolerance to account for rounding). + +You might notice that all the tests check the outputs the player could see rather than the internal battle state. e.g. the Meditate test could have used `gBattleMons[B_POSITION_OPPONENT_LEFT].hp` instead of using `HP_BAR` to capture the damage. This is a deliberate choice, by checking what the player can observe the tests are more robust to refactoring, e.g. if `gBattleMons` got moved into `gBattleStruct` then any test that used it would need to be updated. + +### Note on Overworld Tests +The overworld is not available, so it is only possible to test commands which don't affect the overworld itself, e.g. `givemon` can be tested because it only alters `gPlayerParty`, but `addobject` cannot because it affects object events (which aren't loaded). + +## REFERENCE + +### `ASSUME` +`ASSUME(cond)` +Causes the test to be skipped if `cond` is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use: +`ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);` + +### `ASSUMPTIONS` +``` +ASSUMPTIONS +{ + ... +} +``` +Should be placed immediately after any `#includes` and contain any `ASSUME` statements which should apply to the whole file, e.g. to test `EFFECT_POISON_HIT` we need to choose a move with that effect, if we chose to use Poison Sting in every test then the top of `move_effect_poison_hit.c` should be: +``` +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); +} +``` + +### `SINGLE_BATTLE_TEST` +`SINGLE_BATTLE_TEST(name, results...)` and `DOUBLE_BATTLE_TEST(name, results...)` +Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. +The main differences for doubles are: + - Move targets sometimes need to be explicit. + - Instead of `player` and `opponent` there is `playerLeft`, `playerRight`, `opponentLeft`, and `opponentRight`. + +### `AI_SINGLE_BATTLE_TEST` +`AI_SINGLE_BATTLE_TEST(name, results...)` and `AI_DOUBLE_BATTLE_TEST(name, results...)` +Define battles where opponent mons are controlled by AI, the same that runs +when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command. +The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with some differences: + - opponent's action is specified by the `EXPECT_MOVE` / `EXPECT_SEND_OUT` / `EXPECT_SWITCH` commands + - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do + - we still control the player's action the same way + - apart from the `EXPECTED` commands, there's also a new `SCORE_` and `SCORE__VAL` commands + +### `KNOWN_FAILING` +`KNOWN_FAILING;` +Marks a test as not passing due to a bug. If there is an issue number associated with the bug it should be included in a comment. If the test passes the developer will be notified to remove `KNOWN_FAILING`. +For example: +``` +SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target") +{ + KNOWN_FAILING; // #2596. + ... +} +``` +### `PARAMETRIZE` +`PARAMETERIZE { parameter; }` +Runs a test multiple times. `i` will be set to which parameter is running, and `results` will contain an entry for each parameter, e.g.: +``` +SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage) +{ + u16 hp; + PARAMETRIZE { hp = 99; } + PARAMETRIZE { hp = 33; } + GIVEN { + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT(results[1].damage > results[0].damage); + } +} +``` +### `PASSES_RANDOMLY` +`PASSES_RANDOMLY(successes, trials, [tag])` +Checks that the test passes successes/trials. If `tag` is provided, the test is run for each value that the tag can produce. For example, to check that Paralysis causes the turn to be skipped 25/100 times, we can write the following test that passes only if the Pokémon is fully paralyzed and specify that we expect it to pass 25/100 times when `RNG_PARALYSIS` varies: +``` +SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn") +{ + PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Wobbuffet is paralyzed! It can't move!"); + } +} +``` +All `BattleRandom` calls involving tag will return the same number, so this cannot be used to have two moves independently hit or miss, for example. + +If the tag is not provided, runs the test 50 times and computes an approximate pass ratio. +`PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100);` +Note that this mode of PASSES_RANDOMLY makes the tests run very slowly and should be avoided where possible. If the mechanic you are testing is missing its tag, you should add it. + +### `GIVEN` +``` +Given { + ... +} +``` +Contains the initial state of the parties before the battle. + +## `RNGSeed` +`RNGSeed(seed)` +Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool. +Example: +``` +GIVEN { + RNGSeed(0xC0DEIDEA); + ... +} +``` + +### `FLAG_SET` +`FLAG_SET(flagId)` +Sets the specified flag. Can currently only set one flag at a time. +Cleared between parameters and at the end of the test. +Example: +``` +GIVEN { + FLAG_SET(FLAG_SYS_EXAMPLE_FLAG); + ... +} +``` + +### `PLAYER` and `OPPONENT` +`PLAYER(species)` and `OPPONENT(species` +Adds the species to the player's or opponent's party respectively. +The Pokémon can be further customized with the following functions: + - `Gender(MON_MALE | MON_FEMALE)` + - `Nature(nature)` + - `Ability(ability)` + - `Level(level)` + - `MaxHP(n)`, `HP(n)`, `Attack(n)`, `Defense(n)`, `SpAttack(n)`, `SpDefense(n)`, `Speed(n)` + - `Item(item)` + - `Moves(moves...)` + - `Friendship(friendship)` + - `Status1(status1)` +For example to create a level 42 Wobbuffet that is poisoned: +`PLAYER(SPECIES_WOBBUFFET) { Level(42); Status1(STATUS1_POISON); }` +**Note if Speed is specified for any Pokémon then it must be specified for all Pokémon.** +**Note if Moves is specified then MOVE will not automatically add moves to the moveset.** + +### `AI_FLAGS` +`AI_FLAGS(flags)` +Specifies which AI flags are run during the test. Has use only for AI tests. +The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` which is the general 'smart' AI. + +### `WHEN` +``` + ... +} WHEN { + ... +} +``` +Contains the choices that battlers make during the battle. + +### `TURN` +`TURN { ... }` +Groups the choices made by the battlers on a single turn. If Speeds have not been explicitly specified then the order of the `MOVE` commands in the `TURN` will be used to infer the Speeds of the Pokémon, e.g.: +``` + // player's speed will be greater than opponent's speed. + TURN { MOVE(player, MOVE_SPLASH); MOVE(opponent, MOVE_SPLASH); } + // opponent's speed will be greater than player's speed. + TURN { MOVE(opponent, MOVE_SPLASH); MOVE(player, MOVE_SPLASH); } +``` +The inference process is naive, if your test contains anything that modifies the speed of a battler you should specify them explicitly. + +### `MOVE` +`MOVE(battler, move | moveSlot:, [megaEvolve:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value])` +Used when the battler chooses Fight. Either the move ID (e.g. `MOVE_TACKLE` or move slot must be specified. + - `megaEvolve: TRUE` causes the battler to Mega Evolve if able + - `hit: FALSE` causes the move to miss + - `criticalHit: TRUE` causes the move to land a critical hit + - `target:` is used in double battles to choose the target (when necessary) + - `allowed: FALSE` is used to reject an illegal move e.g. a Disabled one + - `WITH_RNG` allows the move to specify an explicit outcome for an RNG tag +``` + MOVE(playerLeft, MOVE_TACKLE, target: opponentRight); +``` +If the battler does not have an explicit Moves specified the moveset will be populated based on the `MOVE`s it uses. + +### `FORCED_MOVE` +`FORCED_MOVE(battler)` +Used when the battler chooses Fight and then their move is chosen for them, e.g. when affected by Encore. +``` + FORCED_MOVE(player); +``` + +### `SWITCH` +`SWITCH(battler, partyIndex)` +Used when the battler chooses Switch. +``` + SWITCH(player, 1); +``` + +### `SKIP_TURN` +`SKIP_TURN(battler)` +Used when the battler cannot choose an action, e.g. when locked into Thrash. +``` + SKIP_TURN(player); +``` + +### `SEND_OUT` +`SEND_OUT(battler, partyIndex)` +Used when the battler chooses to switch to another Pokémon but not via Switch, e.g. after fainting or due to a U-turn. +``` + SEND_OUT(player, 1); +``` + +### `USE_ITEM` +`USE_ITEM(battler, itemId, [partyIndex:], [move:])` +Used when the battler chooses to use an item from the Bag. The item ID (e.g. ITEM_POTION) must be specified, and party index and move slot if applicable, e.g: +``` + USE_ITEM(player, ITEM_X_ATTACK); + USE_ITEM(player, ITEM_POTION, partyIndex: 0); + USE_ITEM(player, ITEM_LEPPA_BERRY, partyIndex: 0, move: MOVE_TACKLE); +``` + +### `SCENE` +``` + ... +} SCENE { + ... +} +``` +Contains an abridged description of the UI during the `THEN`. The order of the description must match too, e.g. +``` +} SCENE { + // ABILITY_POPUP followed by a MESSAGE + ABILITY_POPUP(player, ABILITY_STURDY); + MESSAGE("Geodude was protected by Sturdy!"); +} +``` + +### `ABILITY_POPUP` +`ABILITY_POPUP(battler, [ability])` +Causes the test to fail if the battler's ability pop-up is not shown. +If specified, ability is the ability shown in the pop-up. +``` + ABILITY_POPUP(opponent, ABILITY_MOLD_BREAKER); +``` + +### `ANIMATION` +`ANIMATION(type, animId, [battler], [target:])` +Causes the test to fail if the animation does not play. A common use of this command is to check if a move was successful, e.g.: +``` + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); +``` +`target` can only be specified for `ANIM_TYPE_MOVE`. + +### `EXPERIENCE_BAR` +`EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])` +If `exp:` is used, causes the test to fail if that amount of experience is not gained, e.g.: +``` + EXPERIENCE_BAR(player, exp: 0); +``` +If `captureGainedExp:` is used, causes the test to fail if the Experience bar does not change, and then writes that change to the pointer, e.g.: +``` + u32 exp; + EXPERIENCE_BAR(player, captureGainedExp: &exp); +``` +If none of the above are used, causes the test to fail if the Exp does not change at all. +**Please note that due to nature of tests, this command is only usable in `WILD_BATTLE_TEST` and will fail elsewhere.** + +### `HP_BAR` +`HP_BAR(battler, [damage: | hp: | captureDamage: | captureHP:])` +If `hp:` or `damage:` are used, causes the test to fail if that amount of damage is not dealt, e.g.: +``` + HP_BAR(player, hp: 0); +``` +If `captureDamage:` or `captureHP:` are used, causes the test to fail if the HP bar does not change, and then writes that change to the + pointer, e.g.: +``` + s16 damage; + HP_BAR(player, captureDamage: &damage); +``` +If none of the above are used, causes the test to fail if the HP does not change at all. + +### MESSAGE +`MESSAGE(pattern)` +Causes the test to fail if the message in pattern is not displayed. +Spaces in pattern match newlines (\n, \l, and \p) in the message. +Often used to check that a battler took its turn but it failed, e.g.: +``` + MESSAGE("Wobbuffet used Dream Eater!"); + MESSAGE("Foe Wobbuffet wasn't affected!"); +``` + +### `STATUS_ICON` +`STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)` +Causes the test to fail if the battler's status is not changed to the specified status. +``` + STATUS_ICON(player, badPoison: TRUE); +``` +If the expected status icon is parametrized the corresponding `STATUS1` constant can be provided, e.g.: +``` + u32 status1; + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_BURN; } + ... + STATUS_ICON(player, status1); +``` + +### `NOT` +`NOT sceneCommand` +Causes the test to fail if the `SCENE` command succeeds before the following command succeeds. +``` + // Our Wobbuffet does not Celebrate before the foe's. + NOT MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("Foe Wobbuffet used Celebrate!"); +``` +**NOTE**: If this condition fails, the viewable ROM freezes at the NOT command. +**WARNING: `NOT` is an alias of `NONE_OF`, so it behaves surprisingly when applied to multiple commands wrapped in braces.** + +### `ONE_OF` +``` + ONE_OF { + ... + } +``` +Causes the test to fail unless one of the `SCENE` commands succeeds. +``` + ONE_OF { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("Wobbuffet is paralyzed! It can't move!"); + } +``` + +### `NONE_OF` +``` + NONE_OF { + ... + } +``` +Causes the test to fail if one of the `SCENE` commands succeeds before the command after the `NONE_OF` succeeds. +``` + // Our Wobbuffet does not move before the foe's. + NONE_OF { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("Wobbuffet is paralyzed! It can't move!"); + } + MESSAGE("Foe Wobbuffet used Celebrate!"); +``` + +### `PLAYER_PARTY` +Refer to the party members defined in `GIVEN`, e.g.: +``` + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / 2); +``` +### `OPPONENT_PARTY` +Refer to the party members defined in `GIVEN`, e.g.: +``` + s32 maxHP = GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP); + HP_BAR(opponent, damage: maxHP / 2); +``` + +### `THEN` +``` + ... +} THEN { + ... +} +``` +Contains code to run after the battle has finished. If the test is using `PARAMETRIZE` commands then `EXPECT` commands between the results should go here. Is also occasionally used to check the internal battle state when checking the behavior via a `SCENE` is too difficult, verbose, or error-prone. + +### `FINALLY` +``` + ... +} FINALLY { + ... +} +``` +Contains checks to run after all `PARAMETERIZE` commands have run. Prefer to write your checks in `THEN` where possible, because a failure in `THEN` will be tagged with which parameter it corresponds to. + +### `EXPECT` +`EXPECT(cond)` +Causes the test to fail if `cond` is false. + +### `EXPECT_XX` +`EXPECT_EQ(a, b)` +`a == b` + +`EXPECT_NE(a, b)` +`a != b` + +`EXPECT_LT(a, b)` +`a < b` + +`EXPECT_LE(a, b)` +`a <= b` + +`EXPECT_GT(a, b)` +`a > b` + +`EXPECT_GE(a, b)` +`a >= b` + +Causes the test to fail if a and b compare incorrectly, e.g. +``` + EXPECT_EQ(results[0].damage, results[1].damage); +``` + +### `EXPECT_MUL_EQ` +`EXPECT_MUL_EQ(a, m, b)` + Causes the test to fail if `a*m != b` (within a threshold), e.g. +``` + // Expect results[0].damage * 1.5 == results[1].damage. + EXPECT_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); +``` + +## Overworld Command Reference + +### `OVERWORLD_SCRIPT` +`OVERWORLD_SCRIPT(instructions...)` +Returns a pointer to a compiled overworld script. Cannot be used to initialize global `const` data, although the pointer **IS** to `const` data. +Note that each script command must be followed by a ;, e.g.: +``` +const u8 *myScript = OVERWORLD_SCRIPT( + random 2; + addvar VAR_RESULT, 1; +); +``` + +### `RUN_OVERWORLD_SCRIPT` +`RUN_OVERWORLD_SCRIPT(instructions...)` +Runs an overworld script in the immediate script context, which means that commands like `waitstate` are not supported. +``` + RUN_OVERWORLD_SCRIPT( + setvar VAR_RESULT, 3; + ); + EXPECT_EQ(GetVar(VAR_RESULT), 3); +``` diff --git a/docs/how_to_trainer_class.md b/docs/how_to_trainer_class.md new file mode 100644 index 0000000000..a47cbe19c5 --- /dev/null +++ b/docs/how_to_trainer_class.md @@ -0,0 +1,178 @@ +# How to add a new trainer class + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. The Animation](#2-the-animation) + * [4. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [5. Defining the trainer class](#2-defining-the-trainer-class) +* [Usage](#usage) + +## Quick Summary +(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).) +If you've done this before and just need a quick lookup, here's what files you need: +1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) +2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) +3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h) +4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) +5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) +6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) +7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) + +## The Graphics + +### 1. Edit the sprites +We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: +[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) + +**Remember to limit yourself to 16 colors including transparency in the first slot!** + +Export the pallette and place into the same folder. + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. +Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h): +```diff +extern const u32 gTrainerFrontPic_RubySapphireMay[]; ++ extern const u32 gTrainerFrontPic_myTrainerClass[]; + +extern const u32 gTrainerPalette_Hiker[]; +... + +... +extern const u32 gTrainerPalette_RubySapphireMay[]; ++ extern const u32 gTrainerPalette_myTrainerClass[]; + +extern const u8 gTrainerBackPic_Brendan[]; +``` + +Now link the graphic files. +[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): +```diff +const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); + +const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz"); +const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); + ++ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz"); ++ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); + +const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4 +``` + +### 3. The Animation +Add the Animation of the trainer here: +[src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) + +The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame: + +```diff +static const union AnimCmd *const sAnims_RubySapphireMay[] ={ + sAnim_GeneralFrame0, +}; + ++ static const union AnimCmd *const sAnims_MyTrainerClass[] ={ ++ sAnim_GeneralFrame0, ++ }; + +const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] = +{ + [TRAINER_PIC_HIKER] = sAnims_Hiker, + [TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM, + [TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF, +... + +... + [TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan, + [TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay, ++ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass, +}; +``` + +### 4. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do: + +1. gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen. +2. gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier. +3. gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier. + +So, finally, it needs to look like this: +```diff +const struct MonCoords gTrainerFrontPicCoords[] = +{ + [TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1}, + [TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1}, +... + +... + [TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1}, + [TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1}, ++ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1}, +}; + +#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic} + +const struct CompressedSpriteSheet gTrainerFrontPicTable[] = +{ + TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800), + TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800), + TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800), + TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800), +... + +... + TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800), + TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800), ++ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800), +}; + +#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic} + +const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] = +{ + TRAINER_PAL(HIKER, gTrainerPalette_Hiker), + TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM), + TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF), +... + +... + TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan), + TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay), ++ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass), +}; + +``` +### The Data +#### 5. Defining the trainer class +Finally, let's bring it all together by defining our new trainer class in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): + +```diff +#define TRAINER_PIC_RS_MAY 92 ++ #define TRAINER_PIC_MYTRAINERCLASS 93 + +#define TRAINER_BACK_PIC_BRENDAN 0 +#define TRAINER_BACK_PIC_MAY 1 +``` +Remember to count the number next to the trainer class up by one! + +## Usage +You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: +```diff + [TRAINER_BRENDAN_PLACEHOLDER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RS_PROTAG, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, +- .trainerPic = TRAINER_PIC_RS_BRENDAN, ++ .trainerPic = TRAINER_PIC_MYTRAINERCLASS, + .trainerName = _("BRENDAN"), + .items = {}, + .doubleBattle = FALSE, + .aiFlags = 0, + .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), + .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, + }, +``` From 1f93c25611ccc7a55172005557073c496dc4aa8a Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Mon, 5 Aug 2024 21:18:35 +0200 Subject: [PATCH 041/225] use `OBJ_EVENT_GFX_SPECIES_MASK` in `bufferspeciesname` (#5088) Co-authored-by: sbird --- src/scrcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scrcmd.c b/src/scrcmd.c index b642f41ede..ff3225aed1 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1693,7 +1693,7 @@ bool8 ScrCmd_vmessage(struct ScriptContext *ctx) bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 species = VarGet(ScriptReadHalfword(ctx)) & ((1 << 10) - 1); // ignore possible shiny / form bits + u16 species = VarGet(ScriptReadHalfword(ctx)) & OBJ_EVENT_GFX_SPECIES_MASK; // ignore possible shiny / form bits StringCopy(sScriptStringVars[stringVarIndex], GetSpeciesName(species)); return FALSE; From 12351d520dcff6cec858bab53264ed96860f0087 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:54:37 +0200 Subject: [PATCH 042/225] Changes Evolution methods to Enums (#4977) * Changes Evolution methods to Enums * make U8_ENUM to include/constants/global.h * revert previous commit * Update include/constants/pokemon.h --------- Co-authored-by: Eduardo Quezada --- include/constants/pokemon.h | 133 +++++++++++++++++++----------------- include/pokemon.h | 2 +- src/pokemon.c | 2 +- 3 files changed, 73 insertions(+), 64 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 8095367c97..809fcc22d4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -243,71 +243,80 @@ #define F_SUMMARY_SCREEN_FLIP_SPRITE 0x80 -// Evolution types #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. #define EVO_NONE 0xFFFE // Not an actual evolution, used to generate offspring that can't evolve into the specified species, like regional forms. -#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 -#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 -#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 -#define EVO_LEVEL 4 // Pokémon reaches the specified level -#define EVO_TRADE 5 // Pokémon is traded -#define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item -#define EVO_ITEM 7 // specified item is used on Pokémon -#define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense -#define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense -#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense -#define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value -#define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value -#define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) -#define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) -#define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value -#define EVO_LEVEL_FEMALE 16 // Pokémon reaches the specified level, is female -#define EVO_LEVEL_MALE 17 // Pokémon reaches the specified level, is male -#define EVO_LEVEL_NIGHT 18 // Pokémon reaches the specified level, is night -#define EVO_LEVEL_DAY 19 // Pokémon reaches the specified level, is day -#define EVO_LEVEL_DUSK 20 // Pokémon reaches the specified level, is dusk (5-6 P.M) -#define EVO_ITEM_HOLD_DAY 21 // Pokémon levels up, holds specified item at day -#define EVO_ITEM_HOLD_NIGHT 22 // Pokémon levels up, holds specified item at night -#define EVO_MOVE 23 // Pokémon levels up, knows specified move -#define EVO_FRIENDSHIP_MOVE_TYPE 24 // Pokémon levels up with friendship ≥ 220, knows move with specified type -#define EVO_MAPSEC 25 // Pokémon levels up on specified mapsec -#define EVO_ITEM_MALE 26 // specified item is used on a male Pokémon -#define EVO_ITEM_FEMALE 27 // specified item is used on a female Pokémon -#define EVO_LEVEL_RAIN 28 // Pokémon reaches the specified level during rain in the overworld -#define EVO_SPECIFIC_MON_IN_PARTY 29 // Pokémon levels up with a specified Pokémon in party -#define EVO_LEVEL_DARK_TYPE_MON_IN_PARTY 30 // Pokémon reaches the specified level with a Dark Type Pokémon in party -#define EVO_TRADE_SPECIFIC_MON 31 // Pokémon is traded for a specified Pokémon -#define EVO_SPECIFIC_MAP 32 // Pokémon levels up on specified map -#define EVO_LEVEL_NATURE_AMPED 33 // Pokémon reaches the specified level, it has a Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky nature. -#define EVO_LEVEL_NATURE_LOW_KEY 34 // Pokémon reaches the specified level, it has a Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful nature. -#define EVO_CRITICAL_HITS 35 // Pokémon performs specified number of critical hits in one battle -#define EVO_SCRIPT_TRIGGER_DMG 36 // Pokémon has specified HP below max, then player interacts trigger -#define EVO_DARK_SCROLL 37 // interacts with Scroll of Darkness -#define EVO_WATER_SCROLL 38 // interacts with Scroll of Waters -#define EVO_ITEM_NIGHT 39 // specified item is used on Pokémon, is night -#define EVO_ITEM_DAY 40 // specified item is used on Pokémon, is day -#define EVO_ITEM_HOLD 41 // Pokémon levels up, holds specified item -#define EVO_LEVEL_FOG 42 // Pokémon reaches the specified level during fog in the overworld -#define EVO_MOVE_TWO_SEGMENT 43 // Pokémon levels up, knows specified move, has a personality value with a modulus of 0 -#define EVO_MOVE_THREE_SEGMENT 44 // Pokémon levels up, knows specified move, has a personality value with a modulus of 1-99 -#define EVO_LEVEL_FAMILY_OF_THREE 45 // Pokémon reaches the specified level in battle with a personality value with a modulus of 0 -#define EVO_LEVEL_FAMILY_OF_FOUR 46 // Pokémon reaches the specified level in battle with a personality value with a modulus of 1-99 -#define EVO_USE_MOVE_TWENTY_TIMES 47 // Pokémon levels up after having used a move for at least 20 times -#define EVO_RECOIL_DAMAGE_MALE 48 // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a male -#define EVO_RECOIL_DAMAGE_FEMALE 49 // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a female -#define EVO_ITEM_COUNT_999 50 // Pokémon levels up after trainer has collected 999 of a specific item -#define EVO_DEFEAT_THREE_WITH_ITEM 51 // Pokémon levels up after having defeat 3 Pokémon of the same species holding the specified item -#define EVO_OVERWORLD_STEPS 52 // Pokémon levels up after having taken a specific amount of steps in the overworld (or as the party lead if OW_FOLLOWERS_ENABLED is FALSE) without switching -// Evolution 'modes,' for GetEvolutionTargetSpecies -#define EVO_MODE_NORMAL 0 -#define EVO_MODE_CANT_STOP 1 -#define EVO_MODE_TRADE 2 -#define EVO_MODE_ITEM_USE 3 -#define EVO_MODE_ITEM_CHECK 4 // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve -#define EVO_MODE_BATTLE_SPECIAL 5 -#define EVO_MODE_OVERWORLD_SPECIAL 6 -#define EVO_MODE_BATTLE_ONLY 7 // This mode is only used in battles to support Tandemaus' unique requirement +#if MODERN +#define U8_ENUM : u8 +#else +#define U8_ENUM +#endif + +enum EvolutionMethods U8_ENUM { + EVO_FRIENDSHIP, // Pokémon levels up with friendship ≥ 220 + EVO_FRIENDSHIP_DAY, // Pokémon levels up during the day with friendship ≥ 220 + EVO_FRIENDSHIP_NIGHT, // Pokémon levels up at night with friendship ≥ 220 + EVO_LEVEL, // Pokémon reaches the specified level + EVO_TRADE, // Pokémon is traded + EVO_TRADE_ITEM, // Pokémon is traded while it's holding the specified item + EVO_ITEM, // specified item is used on Pokémon + EVO_LEVEL_ATK_GT_DEF, // Pokémon reaches the specified level with attack > defense + EVO_LEVEL_ATK_EQ_DEF, // Pokémon reaches the specified level with attack = defense + EVO_LEVEL_ATK_LT_DEF, // Pokémon reaches the specified level with attack < defense + EVO_LEVEL_SILCOON, // Pokémon reaches the specified level with a Silcoon personality value + EVO_LEVEL_CASCOON, // Pokémon reaches the specified level with a Cascoon personality value + EVO_LEVEL_NINJASK, // Pokémon reaches the specified level (special value for Ninjask) + EVO_LEVEL_SHEDINJA, // Pokémon reaches the specified level (special value for Shedinja) + EVO_BEAUTY, // Pokémon levels up with beauty ≥ specified value + EVO_LEVEL_FEMALE, // Pokémon reaches the specified level, is female + EVO_LEVEL_MALE, // Pokémon reaches the specified level, is male + EVO_LEVEL_NIGHT, // Pokémon reaches the specified level, is night + EVO_LEVEL_DAY, // Pokémon reaches the specified level, is day + EVO_LEVEL_DUSK, // Pokémon reaches the specified level, is dusk (5-6 P.M) + EVO_ITEM_HOLD_DAY, // Pokémon levels up, holds specified item at day + EVO_ITEM_HOLD_NIGHT, // Pokémon levels up, holds specified item at night + EVO_MOVE, // Pokémon levels up, knows specified move + EVO_FRIENDSHIP_MOVE_TYPE, // Pokémon levels up with friendship ≥ 220, knows move with specified type + EVO_MAPSEC, // Pokémon levels up on specified mapsec + EVO_ITEM_MALE, // specified item is used on a male Pokémon + EVO_ITEM_FEMALE, // specified item is used on a female Pokémon + EVO_LEVEL_RAIN, // Pokémon reaches the specified level during rain in the overworld + EVO_SPECIFIC_MON_IN_PARTY, // Pokémon levels up with a specified Pokémon in party + EVO_LEVEL_DARK_TYPE_MON_IN_PARTY, // Pokémon reaches the specified level with a Dark Type Pokémon in party + EVO_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon + EVO_SPECIFIC_MAP, // Pokémon levels up on specified map + EVO_LEVEL_NATURE_AMPED, // Pokémon reaches the specified level, it has a Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky nature. + EVO_LEVEL_NATURE_LOW_KEY, // Pokémon reaches the specified level, it has a Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful nature. + EVO_CRITICAL_HITS, // Pokémon performs specified number of critical hits in one battle + EVO_SCRIPT_TRIGGER_DMG, // Pokémon has specified HP below max, then player interacts trigger + EVO_DARK_SCROLL, // interacts with Scroll of Darkness + EVO_WATER_SCROLL, // interacts with Scroll of Waters + EVO_ITEM_NIGHT, // specified item is used on Pokémon, is night + EVO_ITEM_DAY, // specified item is used on Pokémon, is day + EVO_ITEM_HOLD, // Pokémon levels up, holds specified item + EVO_LEVEL_FOG, // Pokémon reaches the specified level during fog in the overworld + EVO_MOVE_TWO_SEGMENT, // Pokémon levels up, knows specified move, has a personality value with a modulus of 0 + EVO_MOVE_THREE_SEGMENT, // Pokémon levels up, knows specified move, has a personality value with a modulus of 1-99 + EVO_LEVEL_FAMILY_OF_THREE, // Pokémon reaches the specified level in battle with a personality value with a modulus of 0 + EVO_LEVEL_FAMILY_OF_FOUR, // Pokémon reaches the specified level in battle with a personality value with a modulus of 1-99 + EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times + EVO_RECOIL_DAMAGE_MALE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a male + EVO_RECOIL_DAMAGE_FEMALE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a female + EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item + EVO_DEFEAT_THREE_WITH_ITEM, // Pokémon levels up after having defeat 3 Pokémon of the same species holding the specified item + EVO_OVERWORLD_STEPS, // Pokémon levels up after having taken a specific amount of steps in the overworld +}; + +enum EvolutionMode U8_ENUM { + EVO_MODE_NORMAL, + EVO_MODE_CANT_STOP, + EVO_MODE_TRADE, + EVO_MODE_ITEM_USE, + EVO_MODE_ITEM_CHECK, // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve + EVO_MODE_BATTLE_SPECIAL, + EVO_MODE_OVERWORLD_SPECIAL, + EVO_MODE_BATTLE_ONLY, // This mode is only used in battles to support Tandemaus' unique requirement +}; #define MON_PIC_WIDTH 64 #define MON_PIC_HEIGHT 64 diff --git a/include/pokemon.h b/include/pokemon.h index b299ab7d61..a67241fb14 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -798,7 +798,7 @@ u8 GetItemEffectParamOffset(u32 battler, u16 itemId, u8 effectByte, u8 effectBit u8 *UseStatIncreaseItem(u16 itemId); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem, struct Pokemon *tradePartner); +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner); bool8 IsMonPastEvolutionLevel(struct Pokemon *mon); u16 NationalPokedexNumToSpecies(u16 nationalNum); u16 NationalToHoennOrder(u16 nationalNum); diff --git a/src/pokemon.c b/src/pokemon.c index 2b731ef13c..c8d52ddb9d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4410,7 +4410,7 @@ static u32 GetGMaxTargetSpecies(u32 species) return SPECIES_NONE; } -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem, struct Pokemon *tradePartner) +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) { int i, j; u16 targetSpecies = SPECIES_NONE; From 745db06dc816b22eefd016189ef07dd9c818203f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 6 Aug 2024 00:12:55 +0200 Subject: [PATCH 043/225] Doesn't compile on some compilers (#5099) the u8 should be brought back once we remove agbcc. --- include/constants/pokemon.h | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 809fcc22d4..81671e2eb4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -246,13 +246,7 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. #define EVO_NONE 0xFFFE // Not an actual evolution, used to generate offspring that can't evolve into the specified species, like regional forms. -#if MODERN -#define U8_ENUM : u8 -#else -#define U8_ENUM -#endif - -enum EvolutionMethods U8_ENUM { +enum EvolutionMethods { EVO_FRIENDSHIP, // Pokémon levels up with friendship ≥ 220 EVO_FRIENDSHIP_DAY, // Pokémon levels up during the day with friendship ≥ 220 EVO_FRIENDSHIP_NIGHT, // Pokémon levels up at night with friendship ≥ 220 @@ -307,7 +301,7 @@ enum EvolutionMethods U8_ENUM { EVO_OVERWORLD_STEPS, // Pokémon levels up after having taken a specific amount of steps in the overworld }; -enum EvolutionMode U8_ENUM { +enum EvolutionMode { EVO_MODE_NORMAL, EVO_MODE_CANT_STOP, EVO_MODE_TRADE, From dbb9ee874bad534df3a3a448bf17c45e2fe5d11b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 6 Aug 2024 04:02:31 +0200 Subject: [PATCH 044/225] Change GET_MOVE_TYPE to a function (#5090) * Change GET_MOVE_TYPE to a function * add in battle check to GetMoveType function, move it to battle_util.c * Update src/battle_util.c Co-authored-by: Eduardo Quezada * Update src/battle_util.c --------- Co-authored-by: Eduardo Quezada --- include/battle.h | 7 ------- include/battle_util.h | 1 + src/battle_ai_main.c | 8 ++++---- src/battle_ai_util.c | 9 ++++----- src/battle_anim.c | 7 ++----- src/battle_main.c | 4 ++-- src/battle_script_commands.c | 35 ++++++++++++----------------------- src/battle_util.c | 30 +++++++++++++++--------------- src/battle_z_move.c | 4 +--- 9 files changed, 41 insertions(+), 64 deletions(-) diff --git a/include/battle.h b/include/battle.h index 1aa26a9470..6e1ddf9d1a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -811,13 +811,6 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define F_DYNAMIC_TYPE_IGNORE_PHYSICALITY (1 << 6) // If set, the dynamic type's physicality won't be used for certain move effects. #define F_DYNAMIC_TYPE_SET (1 << 7) // Set for all dynamic types to distinguish a dynamic type of Normal (0) from no dynamic type. -#define GET_MOVE_TYPE(move, typeArg) do { \ - if (gBattleStruct->dynamicMoveType) \ - typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \ - else \ - typeArg = gMovesInfo[move].type; \ -} while(0) - #define IS_MOVE_PHYSICAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) #define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL) #define IS_MOVE_STATUS(move)(gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) diff --git a/include/battle_util.h b/include/battle_util.h index 8eadf47c98..e11e8890c3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -268,5 +268,6 @@ u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera); bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); bool8 IsMonBannedFromSkyBattles(u16 species); void RemoveBattlerType(u32 battler, u8 type); +u32 GetMoveType(u32 move); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 63bab46ec9..68c7bc770f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -826,7 +826,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); if (gMovesInfo[move].powderMove && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); @@ -2749,7 +2749,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 predictedMove = aiData->predictedMoves[battlerDef]; SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); // check what effect partner is using if (aiData->partnerMove != 0) @@ -5047,10 +5047,10 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 effect = gMovesInfo[move].effect; - u32 moveType = gMovesInfo[move].type; + u32 moveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5505bbed18..6a5b71f196 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -354,7 +354,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) && !(unusable & gBitTable[i])) { SetTypeBeforeUsingMove(moves[i], attacker); - GET_MOVE_TYPE(moves[i], moveType); + moveType = GetMoveType(moves[i]); if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, AI_DATA->abilities[target], FALSE) != 0) usable |= gBitTable[i]; } @@ -400,10 +400,9 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef) { - s32 moveType; struct AiLogicData *aiData = AI_DATA; u32 battlerDefAbility; - GET_MOVE_TYPE(move, moveType); + u32 moveType = GetMoveType(move); if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) battlerDefAbility = ABILITY_NONE; @@ -547,7 +546,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); if (gMovesInfo[move].power) @@ -993,7 +992,7 @@ uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], FALSE); RestoreBattlerData(battlerAtk); diff --git a/src/battle_anim.c b/src/battle_anim.c index 71813ddf46..9f6648220e 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -798,7 +798,7 @@ static void Cmd_end(void) // Debugging - ensure no hanging mon bg tasks if (FuncIsActiveTask(Task_UpdateMonBg)) DebugPrintf("Move %d animation still has Task_UpdateMonBg active at the end!", gAnimMoveIndex); - + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); if (!IsContest()) { @@ -2145,12 +2145,9 @@ static void Cmd_stopsound(void) static void Cmd_jumpifmovetypeequal(void) { - u8 moveType; const u8 *type = sBattleAnimScriptPtr + 1; sBattleAnimScriptPtr += 2; - GET_MOVE_TYPE(gCurrentMove, moveType); - - if (*type != moveType) + if (*type != GetMoveType(gCurrentMove)) sBattleAnimScriptPtr += 4; else sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); diff --git a/src/battle_main.c b/src/battle_main.c index 9df19b9566..de9b6f26d3 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5905,13 +5905,13 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) gBattleStruct->dynamicMoveType = TYPE_DARK | F_DYNAMIC_TYPE_SET; } - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) || gStatuses4[battlerAtk] & STATUS4_ELECTRIFIED) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); if (holdEffect == HOLD_EFFECT_GEMS && moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f25cef9cf5..ba95479011 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1193,9 +1193,9 @@ static void Cmd_attackcanceler(void) { CMD_ARGS(); - s32 i, moveType; + s32 i; u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); // Weight-based moves are blocked by Dynamax. if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) @@ -1689,7 +1689,6 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move) { - u32 type; u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); u32 abilityDef = GetBattlerAbility(gBattlerTarget); @@ -1718,8 +1717,8 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u else { u32 accuracy; + u32 type = GetMoveType(move); - GET_MOVE_TYPE(move, type); if (JumpIfMoveAffectedByProtect(move)) return; if (AccuracyCalcHelper(move)) @@ -1959,9 +1958,7 @@ static void Cmd_damagecalc(void) { CMD_ARGS(); - u8 moveType; - - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (gMovesInfo[gCurrentMove].effect == EFFECT_SHELL_SIDE_ARM) gBattleStruct->swapDamageCategory = (gBattleStruct->shellSideArmCategory[gBattlerAttacker][gBattlerTarget] != gMovesInfo[gCurrentMove].category); gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gIsCriticalHit, TRUE, TRUE); @@ -1972,9 +1969,7 @@ static void Cmd_typecalc(void) { CMD_ARGS(); - u8 moveType; - - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), TRUE); gBattlescriptCurrInstr = cmd->nextInstr; @@ -1985,11 +1980,9 @@ static void Cmd_adjustdamage(void) CMD_ARGS(); u8 holdEffect, param; - u32 moveType; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); u32 rand = Random() % 100; - - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) goto END; @@ -2937,8 +2930,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u8 moveType = 0; - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -2951,8 +2943,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) case STATUS1_FREEZE: if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u8 moveType = 0; - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -2991,8 +2982,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) } if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u8 moveType = 0; - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -3062,8 +3052,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) case STATUS1_FROSTBITE: if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u8 moveType = 0; - GET_MOVE_TYPE(gCurrentMove, moveType); + u32 moveType = GetMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -5405,7 +5394,7 @@ static void Cmd_moveend(void) endState = cmd->endState; holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - GET_MOVE_TYPE(gCurrentMove, moveType); + moveType = GetMoveType(gCurrentMove); do { @@ -5896,7 +5885,7 @@ static void Cmd_moveend(void) else { gLastLandedMoves[gBattlerTarget] = gCurrentMove; - GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBattlerTarget]); + gLastHitByType[gBattlerTarget] = GetMoveType(gCurrentMove); } } else diff --git a/src/battle_util.c b/src/battle_util.c index 678778bf1a..8eaf80721c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -196,7 +196,7 @@ void HandleAction_UseMove(void) // Set dynamic move type. SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); - GET_MOVE_TYPE(gChosenMove, moveType); + moveType = GetMoveType(gCurrentMove); // check Z-Move used if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(gCurrentMove) && !IsZMove(gCurrentMove)) @@ -722,7 +722,8 @@ void HandleAction_ActionFinished(void) | HITMARKER_CHARGING | HITMARKER_NEVER_SET | HITMARKER_IGNORE_DISGUISE); // check if Stellar type boost should be used up - GET_MOVE_TYPE(gCurrentMove, moveType); + moveType = GetMoveType(gCurrentMove); + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR && gMovesInfo[gCurrentMove].category != DAMAGE_CATEGORY_STATUS @@ -4086,7 +4087,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else move = gCurrentMove; - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); switch (caseID) { @@ -4459,7 +4460,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 for (j = 0; j < MAX_MON_MOVES; j++) { move = gBattleMons[i].moves[j]; - GET_MOVE_TYPE(move, moveType); + moveType = GetMoveType(move); if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0)) { effect++; @@ -7999,7 +8000,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) case ITEMEFFECT_TARGET: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - GET_MOVE_TYPE(gCurrentMove, moveType); + moveType = GetMoveType(gCurrentMove); switch (battlerHoldEffect) { case HOLD_EFFECT_AIR_BALLOON: @@ -11074,7 +11075,6 @@ static u32 SwapMoveDamageCategory(u32 move) u8 GetBattleMoveCategory(u32 moveId) { - u8 moveType; if (gBattleStruct != NULL && gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky, Tera Blast return SwapMoveDamageCategory(moveId); if (gBattleStruct != NULL && (IsZMove(moveId) || IsMaxMove(moveId))) // TODO: Might be buggy depending on when this is called. @@ -11084,11 +11084,7 @@ u8 GetBattleMoveCategory(u32 moveId) if (IS_MOVE_STATUS(moveId)) return DAMAGE_CATEGORY_STATUS; - else if (gMain.inBattle) - GET_MOVE_TYPE(moveId, moveType); - else - moveType = gMovesInfo[moveId].type; - return gTypesInfo[moveType].damageCategory; + return gTypesInfo[GetMoveType(gCurrentMove)].damageCategory; } static bool32 TryRemoveScreens(u32 battler) @@ -11805,11 +11801,15 @@ static inline bool32 DoesCurrentTargetHaveAbilityImmunity(void) bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef) { - u32 moveType = 0; - GET_MOVE_TYPE(gCurrentMove, moveType); - - return ((CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, BattlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + return ((CalcTypeEffectivenessMultiplier(gCurrentMove, GetMoveType(gCurrentMove), BattlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) || IsBattlerProtected(BattlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) || DoesCurrentTargetHaveAbilityImmunity()); } + +u32 GetMoveType(u32 move) +{ + if (gMain.inBattle && gBattleStruct->dynamicMoveType) + return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; + return gMovesInfo[move].type; +} diff --git a/src/battle_z_move.c b/src/battle_z_move.c index c000c35808..ded719d54b 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -415,9 +415,7 @@ static void ZMoveSelectionDisplayPpNumber(u32 battler) static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) { u8 *txtPtr, *end; - u8 zMoveType; - - GET_MOVE_TYPE(zMove, zMoveType); + u32 zMoveType = GetMoveType(zMove); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; From 89cba94567e1439e73cd2d40c2d51e74a1174975 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Tue, 6 Aug 2024 03:21:12 +0100 Subject: [PATCH 045/225] Update event.inc to accomodate new gDecompressionBuffer name (#5100) --- asm/macros/event.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 83338673cf..891c7fd4ed 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1798,7 +1798,7 @@ .4byte \text .endm - @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gPaletteDecompressionBuffer on the fade out + @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gDecompressionBuffer on the fade out @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. .macro fadescreenswapbuffers mode:req .byte 0xdc From 67f049fddb3a1dc3a8b73bcf9f046da0da28f346 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Tue, 6 Aug 2024 09:45:30 +0100 Subject: [PATCH 046/225] Fixes Defiant interaction with Court Changed Sticky Web + Fickle Beam description (#5093) * Fixes Court Changed Sticky Web deactivating Defiant/Competitive * Fixes Fickle Beam's description * Alternative fix * Remove extra newLine --- data/battle_scripts_1.s | 1 + src/battle_util.c | 1 - src/data/moves_info.h | 4 +-- test/battle/ability/defiant.c | 59 +++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3b38c00478..beb3bd5423 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6356,6 +6356,7 @@ BattleScript_StickyWebOnSwitchInPrintStatMsg: BattleScript_StickyWebOnSwitchInEnd: restoretarget restoreattacker + setbyte sSTICKY_WEB_STAT_DROP, 0 return BattleScript_PerishSongTakesLife:: diff --git a/src/battle_util.c b/src/battle_util.c index 678778bf1a..5520314280 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1137,7 +1137,6 @@ void PrepareStringBattle(u16 stringId, u32 battler) && ((gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) || gBattleScripting.stickyWebStatDrop == 1) && !(gBattleScripting.stickyWebStatDrop == 1 && gSideTimers[targetSide].stickyWebBattlerSide == targetSide)) // Sticky Web must have been set by the foe { - gBattleScripting.stickyWebStatDrop = 0; gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index e79f804bb1..bec17632ec 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -20420,8 +20420,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = { .name = COMPOUND_STRING("Fickle Beam"), .description = COMPOUND_STRING( - "Shoots a beam of light. Sometimes\n" - "twice as strong."), + "Shoots a beam of light.\n" + "Sometimes twice as strong."), .effect = EFFECT_FICKLE_BEAM, .power = 80, .type = TYPE_DRAGON, diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 84b65bdc50..79136a559d 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -139,6 +139,65 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") } } +SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); + // Switch-in - Sticky Web activates + SEND_IN_MESSAGE("Mankey"); + MESSAGE("Mankey was caught in a Sticky Web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Speed fell!"); + // Defiant doesn't activate + NONE_OF { + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); + } + } +} + +SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if Court Changed") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } + TURN { SWITCH(player, 1); } + TURN { MOVE(opponent, MOVE_GROWL);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); + // Switch-in - Sticky Web activates + SEND_IN_MESSAGE("Mankey"); + MESSAGE("Mankey was caught in a Sticky Web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Speed fell!"); + // Defiant doesn't activate + NONE_OF { + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); + } + // Defiant triggers correctly after Sticky Web + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack fell!"); + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); + } +} DOUBLE_BATTLE_TEST("Defiant is activated by Cotton Down for non-ally pokemon") { From 29bb658d1bc94b2cb9b87ed3800a76fe8ea785f0 Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 6 Aug 2024 13:25:26 +0200 Subject: [PATCH 047/225] Fixed some overworld palettes --- .../pokemon/dialga/origin/overworld_shiny.pal | 19 ++++++++++++++++++ graphics/pokemon/enamorus/overworld_shiny.pal | 19 ++++++++++++++++++ .../enamorus/therian/overworld_shiny.pal | 19 ++++++++++++++++++ .../pokemon/giratina/origin/overworld.png | Bin 1965 -> 2102 bytes .../giratina/origin/overworld_shiny.pal | 16 +++++++-------- .../pokemon/palkia/origin/overworld_shiny.pal | 19 ++++++++++++++++++ src/data/graphics/pokemon.h | 8 ++++---- .../pokemon/species_info/gen_4_families.h | 12 +++++------ .../pokemon/species_info/gen_8_families.h | 12 +++++------ 9 files changed, 100 insertions(+), 24 deletions(-) create mode 100644 graphics/pokemon/dialga/origin/overworld_shiny.pal create mode 100644 graphics/pokemon/enamorus/overworld_shiny.pal create mode 100644 graphics/pokemon/enamorus/therian/overworld_shiny.pal create mode 100644 graphics/pokemon/palkia/origin/overworld_shiny.pal diff --git a/graphics/pokemon/dialga/origin/overworld_shiny.pal b/graphics/pokemon/dialga/origin/overworld_shiny.pal new file mode 100644 index 0000000000..e6bfc48201 --- /dev/null +++ b/graphics/pokemon/dialga/origin/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 182 49 +0 0 0 +65 129 255 +189 32 16 +246 80 65 +57 121 180 +98 121 139 +32 64 106 +16 56 90 +24 64 106 +189 202 222 +32 89 148 +139 161 180 +156 210 246 +16 16 16 +24 40 49 diff --git a/graphics/pokemon/enamorus/overworld_shiny.pal b/graphics/pokemon/enamorus/overworld_shiny.pal new file mode 100644 index 0000000000..88fa42851f --- /dev/null +++ b/graphics/pokemon/enamorus/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +41 165 49 +0 0 0 +164 133 41 +230 117 156 +189 60 90 +172 72 82 +238 234 255 +32 36 32 +57 60 57 +205 202 222 +148 32 24 +255 198 57 +16 16 16 +246 85 139 +82 80 90 +115 48 57 diff --git a/graphics/pokemon/enamorus/therian/overworld_shiny.pal b/graphics/pokemon/enamorus/therian/overworld_shiny.pal new file mode 100644 index 0000000000..c799ddfb89 --- /dev/null +++ b/graphics/pokemon/enamorus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +80 80 88 +118 50 58 +232 232 248 +200 200 216 +224 116 156 +174 74 87 +16 16 16 +243 46 46 +199 46 41 +147 33 30 +243 84 143 +187 62 94 +247 238 76 +255 197 60 +0 0 0 diff --git a/graphics/pokemon/giratina/origin/overworld.png b/graphics/pokemon/giratina/origin/overworld.png index cf022c4858307401eb420e320a17477ce618e677..a4de07e1cf22bd5b5c16a27b137b102f95f79595 100644 GIT binary patch delta 2061 zcmV+o2=e!>54I4H7#auz0000ahER`v3q3v`IukRCt{2TZ^`b^^Aq z*RWy3h7B7wY}l}2!-fqTHf-3iVZ(+E8#Zj%uwlc74I4IW*sx*4hW#rB(E7)p#2dqZ zhM#`2Ui^P&$i^>V;=v1lYw} z%rJk%py4;c0Zq8~;00deKQ?xoF`L652|VL%SU@-W=pc|kg~F`xVTcP8*ot9KvoN>| zfxG9w?Ep`2=D`y_!W&Ky{w5;O$z}Gg0$t-#@5Uy973dplG=-MdI>L$rDoB=hi`aC4 zTvZ{1Gbkkx=X@D|b31~+@qSJk^~(e3qKrF2sDxiofv>DE-?Jy0bYpfxpqoie4*m=5 ziTYb?;u~C0@UmhVd0Zob`Ut+p3%uEZ56wW}MH!bIP#8Y1ojCsjUfQqMkwkDtATj7A zoJ5@Y%Lu%lOU&POd@B>M-{#rV$FN%wT*E68c?iuwAeV7}laz5&DC1HH7D71ZuYxZq ziI3oHv>yb=NHl&tvqt11N8i4{7{H zUgZubF=&&22QKl6|I%E1n~=ogJ`rfMw(=}Oa{*ud@My-svL*uWC`c85sAqNXkzlDp zm_UkPPawQrM|0Bwc!9^J1AHTok{=CiXT*X2W&C%Y3LoMXd`m~nEb0wx?nAb8yNGLi zc&cTRL`_B@IOpI*V2wfia=-Sv~IF8Tw zi1a0YaqPrv<{j#BDkRs1iy6u(v51U;RPUjJZwCP;3QrN7=&RQen0PMWRm%V^E4W!b zf0;v-sknew_%42sL@O(N<+S^Snl@O^Y}jSuk4`Nvo}L_Cv_ zuZBVoHXX-(lpv>P%{WK(&@ETm=MKG*kh8_Vahz-Ppn)8+C4rnKhfq)W! zp4+dFGC}}{CZ6xME#9{6n0~dGj#qiX`M@7-Eg~#yxJU?|)Jsd`6<*;#f0h{;oOuz! zV!@K2@tepWzDkEdn6^44eB36Ljv}%_(%xxVc5mdF?Ebc9G8FmN74S`ix7To9yP2M; zU2wwR0As${q1DS0LL?A}Bq8Twys{I2ZsSWDei-j%HsRkNrV)dDz^j=1BX}Z^1qAFq z!=ZYr?D37y;SCog&OkNc5F8fx@(iO>93zM&Plk-K(OL{1>%2R_&f_xtK+35W{3k_ls(KQG}s z-{w}Kp1{NV9W;ESE>5?EdF*CwbajnS^RD1CZupBuBxJIJ0UY1sxwxuq6}-wgi|#}p zA1D)rcDt1X`tYRTvXupa((*}vE-)+dai^`{r|-qf@Mptk$)Sqi6J>LU!hSquQ4#Qv zMeTY=#C!3SK1si%1JXvh5j_%`STJte~`!fu!N!>~<%O_2OeEBI6uM%pmCsss!`_JRm6ucnRB= zoWOmb6+Z04dj%y1-J8U0w{OS%>C;#*KI;UNjH4Cu6axB*cfa6qV**_YU=C<{%icrP zBJ99N1zo&?i;7Dbp-f|cz4*KnWEqcNF0qo(ngaR^eqD(_zN^U0?ZT(C?#3$1kc~*#mJmPT21`jK2-*J0?%E z2tIZr6pB$frxM^N@ECtjAj|>E*Fuyv)Dw8Q*rl_apZM#=r+xxxhgL1X58yHUq9!nh zcYa{=1m1&V@Z9`?!BhCdM8Uj*;x9iNx{puiKH;ZPw;j-l4+h?T!ajjN+Yiy-jgJKW r8bZDJ|Cjv~{eAde=Kd1q|7QCK)$M#TCnBP900000NkvXXu0mjfjpF6` delta 1923 zcmV-}2YmRp5Umf87!3pi0002tcD;-M001YEGAn=Ituz7v00%)yL_t(|ob8yuZ`(!` z$0;4)S@aJ%sx!z;WPr}X<^twd7rW`;QA!;^n`|NnH}=v7s8e)G4LEG8MS>OJvLyiw zl=b2m$zWwGYN#^*sJ=TY^8J!%J6#I!Ef)DXlHd3E-n(a7R%V%HmRV+*WtLfHnPrw) zW|@CwmRV+*eV*Bazq!JtxMMj^dCcw8_-7fy*s`X}pb^wvFC@pR3EW`$nzOn(M&N)? zkjrWm6(LW7=-Do|rk8UqvewE!C?G$4s$7jdf%8MfDz(+snl)PBfD;m2Mj)JeI_e;~ z+9zIV#d#F%*W8tYPgH@o!$9D8EQ3r`J2Wb0A6s=PV z4yaE-m;^&UMFK6u@{isu9*q$=;1i@_3U8`FZ23FFWq8+9?*f{0l=h?OAKJ212N1Rp z35Fbgvs02)o?Kt-dR(B<1nwJsR0YZcp30iwKz&I_azIW4i~~<~00(lGRh$Pm-Z_8H z$OsQPJV`Aup7WsTtj#gCQcdh=Tz+G)7(~0B<0yJh%ixR@;oBjcP`EFbL4Mh#j!WCD zhD{L`I3jwByUiUqYjezj+rnM^9Ts7MLkb8l3FAay{$&(J`)!L06e7$DK;cL!gFIcW zxs;YiL|Eo}ncwlaz~$T$SzCfO$5Mabj_5$3aU`S^M7Y5s@JS%^pNJ7=&zumsrXu%f z-Cdz=Yea-)?x_@Qa0j5xEgc^&vo^>a5T3wNM&V*j@CbuIYXMT^LwO)jQ~`Ze;z%v? zTyfUjTbZ;b8pa5VoQYGqG|ySq221Ve4J}dbfG;@!iW_H~`6DWTBiIPYK;VA_KMLe0 z5KrI@UlZwEp-f=%Ds=}$&R)Ol0r%N& z{e&ngu)@_k&DSZl?YTj6sXbQa%tyIQxEe07)jdoET2hSACkKXHdC!nUkTZn1i|zvd zq3u+@%(Wmp)F$2TmqlO=Y}kM3h8%o=HFB8@9I#3iI`4Me!UzXMt|clI+*{` z1R|NM7!(#s_i$zk^n)D3s3CDR0HD@`A}h6jnlAmoCIJhpDS{=g6(L_Uh_E5PP<2S) zSgk^S{pMk%%Ji{(OydeeJORAvmFIh{Us;#LL@PpxYek5e!XSw-)2Dw3U`a1=edIxF z_GG7+=re^tR;Q#`=pNCjgByg7kmOB^*=STMf>OA()^id%KQsPO$vqroc6ug&eQiJQ0m)l5n1gS`njU>%o=zVz_Hpt|gTs z?Zg__8b#iHwb6um{~)ABg=u{DciY~o@TQUpCn$7pz>iJ$8sGQjQ36U> z;<^L3R_NBpgE)WgpU?*iIu|c)cH>U5!E?bhj}AEG#)P)dF$Z9$t(aog_;wxy#8M@dhDrwyz=|&+lCc!|B#FA6v>y zh&68N6bm0A$-|R3Ws|@(KKni7_@BMxs|xb+?a`b)Tjqbs^yjP|UX5e>eXTq^C7Hwx z=Ir<4<0#(!qitR=p3m;u_7?}eKKH=&Dlf^!INZNRZ$Otgb=zizshmb}4F7VS(7mrO z!E;-u#|LrP@4>j7uam9j{>8Y3R;%B(UTkka->a@ZG&~@cKcKI8mGVBXe_2T5)&@i; zY(~BQK1_e3{ex!Xf*j$S_R5v*XQib{W0j?I*n(J<{^fu?w|r4<6?bshj3G%5xXSg5 za?6P}ZI~>UH6+0jF}yy3Z%2P0t9=!NJh|E?94?Zhpd8eyd>NyOBLb3+B(G zX&h_r-evlZMypHVd=2h)Kaj?V5RK&^5Tb0Mr4g5=aWJ@f_sF|E=N4eU-arO{X&fga zM+!{i%xv2(j1!l}2R1VPsr=T+^f({?k8Di*Q@F7^T!8=o>|c928$@gCpgI5m002ov JPDHLkV1kMLs_*~+ diff --git a/graphics/pokemon/giratina/origin/overworld_shiny.pal b/graphics/pokemon/giratina/origin/overworld_shiny.pal index 560f34aaf5..c05ed66c48 100644 --- a/graphics/pokemon/giratina/origin/overworld_shiny.pal +++ b/graphics/pokemon/giratina/origin/overworld_shiny.pal @@ -3,17 +3,17 @@ JASC-PAL 16 152 208 160 16 16 16 -80 80 80 +96 80 16 40 40 40 248 248 208 -144 144 144 -56 48 24 -16 184 192 -8 112 120 +176 152 24 +56 56 56 +240 80 64 +168 48 64 +232 208 24 184 184 184 -248 224 96 -200 144 48 -112 96 16 +144 144 144 +80 80 80 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/palkia/origin/overworld_shiny.pal b/graphics/pokemon/palkia/origin/overworld_shiny.pal new file mode 100644 index 0000000000..8a6f0c4ab8 --- /dev/null +++ b/graphics/pokemon/palkia/origin/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +32 97 0 +0 0 0 +246 80 65 +172 161 180 +255 238 238 +246 161 156 +131 121 148 +16 16 16 +197 190 213 +246 194 189 +164 80 164 +205 137 197 +106 97 24 +222 218 246 +65 72 74 +82 80 90 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 37258b7f54..2c40dc9d81 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -10834,7 +10834,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gObjectEventPic_DialgaOrigin[] = INCBIN_COMP("graphics/pokemon/dialga/origin/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u32 gOverworldPalette_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_DIALGA @@ -10865,7 +10865,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gObjectEventPic_PalkiaOrigin[] = INCBIN_COMP("graphics/pokemon/palkia/origin/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u32 gOverworldPalette_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PALKIA @@ -14180,7 +14180,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gObjectEventPic_EnamorusIncarnate[] = INCBIN_COMP("graphics/pokemon/enamorus/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u32 gOverworldPalette_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -14193,7 +14193,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gObjectEventPic_EnamorusTherian[] = INCBIN_COMP("graphics/pokemon/enamorus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u32 gOverworldPalette_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_ENAMORUS diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index faa9ed73b4..6b37bb2065 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -5509,8 +5509,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, - gOverworldPalette_DialgaOrigin - //, gShinyOverworldPalette_DialgaOrigin + gOverworldPalette_DialgaOrigin, + gShinyOverworldPalette_DialgaOrigin ) .isLegendary = TRUE, .isFrontierBanned = TRUE, @@ -5647,8 +5647,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, - gOverworldPalette_PalkiaOrigin - //, gShinyOverworldPalette_PalkiaOrigin + gOverworldPalette_PalkiaOrigin, + gShinyOverworldPalette_PalkiaOrigin ) .isLegendary = TRUE, .isFrontierBanned = TRUE, @@ -5924,8 +5924,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, - gOverworldPalette_GiratinaOrigin - //, gShinyOverworldPalette_GiratinaOrigin + gOverworldPalette_GiratinaOrigin, + gShinyOverworldPalette_GiratinaOrigin ) .isLegendary = TRUE, .isFrontierBanned = TRUE, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 353597e96a..bb878e1fed 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -7512,9 +7512,9 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = sPicTable_EnamorusIncarnate, SIZE_64x64, SHADOW_SIZE_M, - TRACKS_NONE - //, gOverworldPalette_EnamorusIncarnate - //, gShinyOverworldPalette_EnamorusIncarnate + TRACKS_NONE, + gOverworldPalette_EnamorusIncarnate, + gShinyOverworldPalette_EnamorusIncarnate ) .isLegendary = TRUE, .levelUpLearnset = sEnamorusLevelUpLearnset, @@ -7574,9 +7574,9 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = sPicTable_EnamorusTherian, SIZE_64x64, SHADOW_SIZE_M, - TRACKS_NONE - //, gOverworldPalette_EnamorusTherian - //, gShinyOverworldPalette_EnamorusTherian + TRACKS_NONE, + gOverworldPalette_EnamorusTherian, + gShinyOverworldPalette_EnamorusTherian ) .isLegendary = TRUE, .levelUpLearnset = sEnamorusLevelUpLearnset, From a9492f5b1c6371afe553cdbcc17388fbec115a56 Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 6 Aug 2024 16:52:42 +0200 Subject: [PATCH 048/225] Fixed Xerneas --- graphics/pokemon/xerneas/active/overworld.png | Bin 0 -> 1832 bytes .../xerneas/active/overworld_normal.pal | 19 ++++++++++++++++++ .../xerneas/active/overworld_shiny.pal | 19 ++++++++++++++++++ graphics/pokemon/xerneas/overworld.png | Bin 1685 -> 1779 bytes .../pokemon/xerneas/overworld_neutral.png | Bin 0 -> 1753 bytes graphics/pokemon/xerneas/overworld_normal.pal | 2 +- graphics/pokemon/xerneas/overworld_shiny.pal | 12 +++++------ spritesheet_rules.mk | 3 +++ src/data/graphics/pokemon.h | 6 +++--- .../object_event_pic_tables_followers.h | 4 ++-- .../pokemon/species_info/gen_6_families.h | 8 ++++---- 11 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 graphics/pokemon/xerneas/active/overworld.png create mode 100644 graphics/pokemon/xerneas/active/overworld_normal.pal create mode 100644 graphics/pokemon/xerneas/active/overworld_shiny.pal create mode 100644 graphics/pokemon/xerneas/overworld_neutral.png diff --git a/graphics/pokemon/xerneas/active/overworld.png b/graphics/pokemon/xerneas/active/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..c5bf3867ee95b534734555d4f10337b8cf00dba5 GIT binary patch literal 1832 zcmV+@2iN$CP)Px#Fi=cXMVZs35D*X`A|^1k-c&yxq*%t(!G4R1Z`w3B|IkA>K+Rlx*f%*r%FNPK zKOO)804X%__5c6|rb$FWRCt{2T#I(%It+}2vB636|DStjWJ9~Rl*UqMch8BsKnaX2 zjUIl$cA5@3CQkV6hR6YV2|N{7hbgx4RY=RWv2ftCR2fdYeD0zAckmUN}fg#?zA ziX(s{c*z&z4wjzMok7j%!~)_=m*@Ni@j(Jvfdr>kavxuSF^MX^tH94HnN&3CocR0b zT6PRCS2BnUOr$UsC55UbS^r{V0e{yg6%fS-2}GtL%cuY|_Pd5QB^f-G@;n0`cm$j1 zQ-)7vGyp?*xQ2ek_kld4@PwIEPp3A0h}df=sV^vq;&&iWTBOhCgkei}R!$j);9|>* zu>t^rYA&HQlE3sqJZ!&m#weY`auy>{&ZV;l9qD?_Ur-RmPeB4L0W4a0Z&4Z|W)_Ck z0(j0U)3XG4ppy{A?+-89a<{+>xxt;hFPB;X`MS4CJrpksv-wAnS((q}HeK zyHvwh{tk5)bVQcWNE7OfBS8fh!B3pu2j80qNi3I(G$>5Jlt!L4l2_rw1d72@(hCN} z)T0#&q*mnKk*hKT zT`Qk*_+bLCnhQoJf9W)Soa)0XSC8b2HADUq8SU3!kB<|GQcC~=SLb=gz2ezW>$$r! z^9RvKWjgo|;9)ERmn?&sjH4fCgz$S1D77nS@aj7TRj_9!%++<4?Z?AoZay1<*aY$U zPvYYQV($1L&SPk)wrX=L@Z*_)TJww+GUux52tWwG1A$@ztQJ7;#{g=}X12i}#|tZG zHUjxLk7|hGcOkGTaFWLck_+b_ZvaAg){WE!1TK}o4kvIBZxST1SCKb*NMEE**13vD zM-*qh= zT)t#^E7dCa$MGg&J=~vxA$*WP^e@c)#A7w!!lxOVsI^kbZ{Vq7kvY$@c$;txA0^PR z{pPa3wjO~l7{!CXPN0{;7(Py5MgG;gYGf7(b-^GW1TIp*pFaR0e3(EEU1@|5-j&S3 z0Qm8`tP5%g_uc@+@KFLeGVyC90#aiEh~O=QYp?z>JA~NbrbyfAEe$+L473FCtVin&@Bi3MP0{gS%1B`(x$*BHZd1!L*wJjw~;qXc5^>ElNN zU>^zHGT1EPm#nsW^ck-McvMS_K(_?(tbe5-EVjL0dDz6r*tLXx73e z-5Tqs18_@Td0U(%(2#!rIeff<1Pm}0AWVAz>|kZ#cRaR>zOMlofie~V+8zvmvFL*L z_)CC3VgnUKQPO>n0M{_fU;vi80mjAHwjNlt5brEXWW;@rK7|5cb5N)Nl+ND*p!X}= zg`KNsFx#1q9jvg62YN6w*gb>XxC{R0-betaoAY{aMAIlA3_!W{pnEX48xRga$o&v` zd+6x-qpRXyzckhnl$&39S2h@cX*lA$Aa4qOKL8Ef4w7%zhTJ0I4bd!d1R%ByjmWPD z;GqX&ZrOJW+Iqam_^A0000XtQTzl9zIYG+I(o{blx$OPYdVwV00vb_L_t(|ob8$cZ|f=yg@c8J1SI_bfBSq4?Y6G%f=}+Z7k>?w{!a%ku(0zwiS6&k6Vp>W3CiG|`1>58n0@XZpbM8z-R1i~DrH993vm zz(-smJskaDf4w$yZ+QBp4?U&(xi@`a`HdIQBK?a0mKP^%O28*}AZjgvPvOS^w4vaG ze+Zv7eV2$Vzg-}p-X=b20B7R&%J{QQ3HaSY*g+lp7LE{p#KkT^Kh53y*@%AG-{GwU zEWdFA${0WKaTbz+-!3_ClLCIjn|{Ie(Drr$R|VBUiI6bvy`;zAeW>827mNmz=CrU%HUBHI7r zO9@#10s*B*x)l5<(@*MeisQ$8`&qURn-cID-ws2!K9GWT@O1;wN4?kkbq%!xCZKj; zsHZ6%anY+~BFAr}fMTJwTBoqUkv{3z?}}Sxl&K;#CEzn2!2_NW>KCH;=IX9pf0Ubs z>hrF3q^GcTBlg!n!?OZn{4@-pSPb4J8=viWbths7wW%UBC*XG+Kq`usL+21g^1Y4X zVR;PQl2(i)T@O1S-=`17(*hzis9}0P+^|X325@NRj*g&+!ZtMkCIx)t_cU-lgmj$2 zwE#myRE-jweHGM`X6Mg5h`ISIe+0A$SpigBzr>EM7eR~fjCln7!Z&G2QUZSH;S|)T zQRFK;MpjDC>37BZGM*POjyl&e$O1mMQ61;xcMAB)Fab)@8W60Fvy}A5CKXM)tU}n_ zcm6q^)FbmrPvJC;7Ehhge&kG3n!<-wTegTIQ=zl1|;XW23 zwUyLTX%$P5=>Smt1pO)Nqjsc|kTlHH7wAX0~e^|aZ!U@Rntbk3|uE@aR<1GXCszb2uz6@mfjSs-)uimtP zg4w(2gM@nEcA{^s&9C0B;u!&L-8Fbm0?-1=QS=$&$P)ZH6s(4O6(D(1Kx|=%@ggn( zXaQ{-JJ=xhN>D>-B~V4`KA9s-W?O z2|x`=_45aS;%NbK>kKD+_-Mp0Aj?ZVs*XWDdIP}mtbn*P_=AZ+$Xoyz-ZD6oBY@yp z0dao|pnDR-Jdn#!aJ*eKx27g|P2G9~U5W*j!Lbp=^0a`6{2@gSrU>a%FrEfV2zazF zcBpb*MuHD`3nJ?ze~NuT$5N8zX#s8M)nZ}v1|aAfBI_~&+pK^&px6Ik+J}&Q{74lX zr{4@WUISnQ-pThy8lJ<3c6GiQe&VH0^T9raK?UI6iUVf_>_Z?36##r7^gsc*k7oyO zrN5uwgtXd;f_xR0Lkmk;6ZvT zP#-}ip!@z9e?x&809}K=W>i;9!nv(k3tJf8SUsJ4;xK-WvG*0Cc!-B;U?Wbqj)bqI=>90JjWf?AHVEv_-K=K}^r5h2U> zB>|wEEO@$UGvA;!Px# delta 1663 zcmV-_27vkV4V4X$7&in10002tcD;-M0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000jP)t-snbV~Z5D+ypG?70Qe;J0WCddBZ;NZ&4(sy-tY!3aP00009a7bBm000id z000id0mpBsWB>pK@kvBMRA}Dqn!#(^RvgFQPxw6EFLCA8QH`aRWJ^q;=~%BZ^_=!7 zNVc<5S03w0CX2hR7em>4bqOmz%7-50?BE^}hv?&A8oNyfe~@u>Z2j(==Dy;h?eLUbC5SdSr|UX7Th>FlT_K2W&0R~y z0Xw=4`WwMTgfFmzX}D4lbnjn$2c-e9UbP$bS~?C+2kvp$ikCHqU2ve|q~S_I=;&*w zhe+pj?8pSWoo3bEUdNPN?=an&ugAN1@fNxqe&DINLJ;r~G_-&Ee-5{DPOc*{M5oh$ z4Ro%vR2;frA=I6GtIVuzbgOXD>89ceL1=ET>D8MjE1`@@kgOod+!j_Tq%gyu6_KtwY2O*uw*@We0AMR?jg|~e;s`zuY1Y<1c%+4+rUSS zMx&G8Y1F#uxLUB*eqyb+d>{RO+p?Z|TqgJc@7cJ`S!#Z%XMNk#cif#zz1Al^o|Y>G zYrUuVUEd$}1Fz8Q$^_34t&hUVF->8+=5{?t`vme zqc&<$j{gZ&lX&&(NKe&+s6e|%q6ah0IxVXDD3Hw>QjHWLC^IX$NZGhtBUo(a*|7!9jD#vU7zXTegb9+_Ics-EX}zgY2BK%EEo) z99$(>4C0rZ17a~Cj-iS(EfRv`>|80>e-*r>PZ9{u!?kGSMdR#TDQHA{5&cXH4*hd* zZ8E~ie>gi=3Bn}Wn~WG$MMVIbi#_ZsjsVG3f?6a3QagY_F%&&+S(;^K;9yJ^!crui zN~yR~(1>0>pOQTU!!R7qh2cv0!b)oivi8d2qWLUV!kGmt{2uSgAB8MYHgSd)7gjgWB5erVJ0F^Pt z#Ry*qhG=fF8H!h=yucY9fXAz37KEuWGU))v_&Pd9d4OY_My5P~am+4L+rP|VN(B&t zf0b**=Z(3MLEp$quf;cNb1D-QJVIWQ2k^)}EFe6j?zE8*q&{C7nPMMNWq47URfJ*k zjf|O7p)RmwPFWhkAHT`BE+9}H08>N$FZ$K4*_EYGo*8p++ zuURkI$@L_uv~et0kOq(@KLcd{MF25?b@J#Hk}s6nSOBpRc>u*_l+oj#H^AEgJwS2< z$^sNTCVzB5_6VFifZ`l^`_M@`l$ZnI2l;0aa@1MP>i=1c{SC$1`IrC82FCyZ002ov JPDHLkV1mp~6~O=i diff --git a/graphics/pokemon/xerneas/overworld_neutral.png b/graphics/pokemon/xerneas/overworld_neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..9d40b9ff59f4f138d640088bc72a66e56324c4b0 GIT binary patch literal 1753 zcmV;~1}6E5P)Px#Fi=cXMVZs35D*X`A|^1k-c&yxq*%t(!G4R1Z`w3B|IkA>K+Rlx*f%*r%FNPK zKOVX4{nC5}C;$Ke5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV85TOho+VJ*$M5@W{9hAwQ{UREZvK@Ouy~%pkKcF$|MEBR zov8N4+CFe)4J>}+2vq%Ko^Ds53dzf*Nx%m)csFlY`r8_MNcXWX*1+O7o>nt=$o{@EelI7&wj~glB;bHKy!!vK zPB-^Cx?^4bw|q$fi{Cf`b>z?fb{EnCf4t?oh#a8pJT^H+0tqmQHwMi>-9h1g^pc{- z4*GT**YEh_@GOBg%drEzYdKyt82Ts*_`V-=Rmd1?0y(4|EmVN6)+>qF8m2rj zhwt3&`ry!PKCF)P5cXy4{rS(}Sptzi4GFXt2OpXppZ&F&vm=GtR1p$HFZfFd1sq{~ z85_Zm;^A=&-jY>}q@52R-@gtY3QrRV*Pw>ke3-ClHU+peH^(w)M`4>v0Anl_%HI5^pq?}zzj7lM#@|7pd&mo*!R<%=+IkUm|IUaUY4B$kN$2z) z9KrW(6!8j+5tZ6w`m5r78=fa{A9b!}APexhjp{f@zc-X^_o+r>!&9cZ`m$T)KT`d_EgO||1Ed_lyqK*{aii96EcH zOX2SzQ1ejG;W>5?XUOCxlswyjl6Y?*+aR!cGdVXiiRTFf_(g&Tp^_W6QBx2*2#wO)2340Px~07;Rk0|`7jky@NUJkRq-;%^~PndtX@Eae<` z0EM^st@bbi{dt-K7T=X{1af$^5w-`}U163;1!D1tz@u6U)gu;xEPmr1u*Iu4s)r@6 zrErN6$l_i4(b|0Xb{C!@(EF}|j|70CeQ9uNq1s zJ&WB$of%4g0uL2cN-I*sJp_ek33TlE4O!sl_~KPC6hkcD_!|U98RYOhf!X3O=TpN~ z>}kf&;Elj4$@q&qfWp%RV(JVdV(_7)kPe9BwVu^-$gWWbaCnwL%nba=ctA4e00!?7 zoXHFz@GOCt-yIm<#8Ag`84Qk(i{^T20&k&PPq9`?jE2BL6pN<`gy&B!dNM`G?qbo+ z7ZKdr7r#`!P9uRAe1wo~6U8}Rpp|6tG=ZLawYVFj4iM`hvb7O7mPIIJ*H$kF1%pTK z;8vn^56;_8;%Nd0zAEbgK_lmK_G1+&zNV4F3*6RfE5Tia#*+k!FEv-;98i$IpziE} zYwE6RR+TJtfXB^-k2|Xg%EfG8}DtwRE3B1(g_i|DD#km(rG5iP> zT&F(_cf2{k6F!LVN*eB?26uJ78ot77oyLoQi-K~%Q%eBO64+BflyU&R(0QVOJo7n# z_tFz_fLkte-vxV(2U4PKJl5?5Ry~9B102ubhZU#i@up7XtS;bt74Gm!2OxN(5j>F5 z3e+>m2@KDV91#^Y$qMyEQa9j04N|nk2ukBP=|2}x}P3E4^t-{P@e`k7jw7u zhP4tB-9>?9mXFyt$^pIyQ3;?}{KEnI9Jwy2TqA-}&UEfz#lP4aufeEb;T`0`T{MB7 zN~pu+zIc5WqHUHBI3PW0(9@aM4WJ!BEuSLq4jm(Y^i+F{p}C5nxcQYAWs?rrragWO z@}c189niu3Ao(#iwJZ?c5#5r21GqMnkso)!hbx#{mVdXP_v1;n$QKNVB0`q$TO2?c v@!_G(yh2wKJyQEg`43HAvSi7U|44oTt50iX*Jn0q00000NkvXXu0mjfUWGz> literal 0 HcmV?d00001 diff --git a/graphics/pokemon/xerneas/overworld_normal.pal b/graphics/pokemon/xerneas/overworld_normal.pal index cfa83f5465..6ba56fe6c6 100644 --- a/graphics/pokemon/xerneas/overworld_normal.pal +++ b/graphics/pokemon/xerneas/overworld_normal.pal @@ -16,4 +16,4 @@ JASC-PAL 55 57 65 202 204 210 84 63 30 -0 0 0 +185 236 253 diff --git a/graphics/pokemon/xerneas/overworld_shiny.pal b/graphics/pokemon/xerneas/overworld_shiny.pal index 6b1dbf9941..6ba56fe6c6 100644 --- a/graphics/pokemon/xerneas/overworld_shiny.pal +++ b/graphics/pokemon/xerneas/overworld_shiny.pal @@ -3,7 +3,7 @@ JASC-PAL 16 153 211 165 16 16 16 -53 51 52 +32 34 38 48 181 222 84 63 30 164 88 198 @@ -11,9 +11,9 @@ JASC-PAL 139 138 111 218 52 55 255 208 67 -25 134 171 -38 199 254 -224 224 224 +55 64 205 +92 123 216 +55 57 65 202 204 210 -119 117 119 -0 0 0 +84 63 30 +185 236 253 diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index a50f48c707..03e6b8a3b1 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -2976,6 +2976,9 @@ $(POKEMONGFXDIR)/noivern/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/xerneas/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/xerneas/active/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/yveltal/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 2c40dc9d81..4c86c0adcd 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -15939,10 +15939,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/shiny.gbapal.lz"); const u8 gMonIcon_XerneasActive[] = INCBIN_U8("graphics/pokemon/xerneas/active/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_XerneasActive[] = INCBIN_COMP("graphics/pokemon/xerneas/active/overworld.4bpp"); + const u32 gObjectEventPic_XerneasActive[] = INCBIN_COMP("graphics/pokemon/xerneas/active/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/overworld_shiny.gbapal.lz"); + //const u32 gOverworldPalette_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/overworld_normal.gbapal.lz"); + //const u32 gShinyOverworldPalette_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_XERNEAS diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h index 46c134d911..b47faf52f1 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -4465,9 +4465,9 @@ static const struct SpriteFrameImage sPicTable_Noivern[] = { static const struct SpriteFrameImage sPicTable_XerneasNeutral[] = { overworld_ascending_frames(gObjectEventPic_XerneasNeutral, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_XerneasActive[] = { +static const struct SpriteFrameImage sPicTable_XerneasActive[] = { overworld_ascending_frames(gObjectEventPic_XerneasActive, 4, 4), -};*/ +}; #endif //P_FAMILY_XERNEAS #if P_FAMILY_YVELTAL diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 46c776639c..973f24e13d 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -5274,9 +5274,9 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = sPicTable_XerneasNeutral, SIZE_64x64, SHADOW_SIZE_M, - TRACKS_FOOT - //, gOverworldPalette_XerneasNeutral - //, gShinyOverworldPalette_XerneasNeutral + TRACKS_FOOT, + gOverworldPalette_XerneasNeutral, + gShinyOverworldPalette_XerneasNeutral ) .isLegendary = TRUE, .isFrontierBanned = TRUE, @@ -5331,7 +5331,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 0, FOOTPRINT(Xerneas) OVERWORLD( - sPicTable_XerneasNeutral, + sPicTable_XerneasActive, SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, From db3bb40c1ae2ec0136fa0243f3a10747d74faa31 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 6 Aug 2024 21:22:51 +0200 Subject: [PATCH 049/225] Accidentaly the Giratina origin overworld shiny pal (#5108) Co-authored-by: Hedara --- .../pokemon/giratina/origin/overworld_shiny.pal | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/graphics/pokemon/giratina/origin/overworld_shiny.pal b/graphics/pokemon/giratina/origin/overworld_shiny.pal index c05ed66c48..560f34aaf5 100644 --- a/graphics/pokemon/giratina/origin/overworld_shiny.pal +++ b/graphics/pokemon/giratina/origin/overworld_shiny.pal @@ -3,17 +3,17 @@ JASC-PAL 16 152 208 160 16 16 16 -96 80 16 +80 80 80 40 40 40 248 248 208 -176 152 24 -56 56 56 -240 80 64 -168 48 64 -232 208 24 -184 184 184 144 144 144 -80 80 80 +56 48 24 +16 184 192 +8 112 120 +184 184 184 +248 224 96 +200 144 48 +112 96 16 0 0 0 0 0 0 0 0 0 From e4f09c810328342d74785a522004fdaff91d046f Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Tue, 6 Aug 2024 16:58:18 -0500 Subject: [PATCH 050/225] Move Relearner now displays move category (#5081) * Move relearner now displays move category * Update move_relearner.c * Update move_relearner.c * Address reviews --- include/config/battle.h | 2 +- include/move_relearner.h | 1 + src/menu_specialized.c | 3 +++ src/move_relearner.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/config/battle.h b/include/config/battle.h index 881e8a2715..d867a223d9 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -219,7 +219,7 @@ #define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. #define B_FAST_EXP_GROW TRUE // If set to TRUE, EXP bars will move faster. #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_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category. +#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary and move relearner showing the move's category. #define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. #define B_EXPANDED_MOVE_NAMES TRUE // If set to FALSE, move names are decreased from 16 characters to 12 characters. #define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles. diff --git a/include/move_relearner.h b/include/move_relearner.h index 51b476d25f..903c80ac7a 100644 --- a/include/move_relearner.h +++ b/include/move_relearner.h @@ -3,5 +3,6 @@ void TeachMoveRelearnerMove(void); void MoveRelearnerShowHideHearts(s32); +void MoveRelearnerShowHideCategoryIcon(s32); #endif //GUARD_MOVE_RELEARNER_H diff --git a/src/menu_specialized.c b/src/menu_specialized.c index a80a227a4b..a709a878dc 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -756,6 +756,9 @@ static void MoveRelearnerLoadBattleMoveDescription(u32 chosenMove) u8 buffer[32]; const u8 *str; + if (B_SHOW_CATEGORY_ICON == TRUE) + MoveRelearnerShowHideCategoryIcon(chosenMove); + FillWindowPixelBuffer(RELEARNERWIN_DESC_BATTLE, PIXEL_FILL(1)); str = gText_MoveRelearnerBattleMoves; x = GetStringCenterAlignXOffset(FONT_NORMAL, str, 128); diff --git a/src/move_relearner.c b/src/move_relearner.c index e27b46fdf7..817dbd16e0 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -1,9 +1,11 @@ #include "global.h" #include "main.h" #include "battle.h" +#include "battle_util.h" #include "bg.h" #include "contest_effect.h" #include "data.h" +#include "decompress.h" #include "event_data.h" #include "field_screen_effect.h" #include "gpu_regs.h" @@ -173,6 +175,7 @@ static EWRAM_DATA struct u8 moveListScrollArrowTask; /*0x113*/ u8 moveDisplayArrowTask; /*0x114*/ u16 scrollOffset; /*0x116*/ + u8 categoryIconSpriteId; /*0x117*/ } *sMoveRelearnerStruct = {0}; static EWRAM_DATA struct { @@ -803,6 +806,9 @@ static void HandleInput(bool8 showContest) ScheduleBgCopyTilemapToVram(1); MoveRelearnerShowHideHearts(GetCurrentSelectedMove()); + if (B_SHOW_CATEGORY_ICON == TRUE) + MoveRelearnerShowHideCategoryIcon(GetCurrentSelectedMove()); + break; case LIST_CANCEL: PlaySE(SE_SELECT); @@ -851,6 +857,10 @@ static void CreateUISprites(void) sMoveRelearnerStruct->moveListScrollArrowTask = TASK_NONE; AddScrollArrows(); + sMoveRelearnerStruct->categoryIconSpriteId = 0xFF; + LoadCompressedSpriteSheet(&gSpriteSheet_CategoryIcons); + LoadSpritePalette(&gSpritePal_CategoryIcons); + // These are the appeal hearts. for (i = 0; i < 8; i++) sMoveRelearnerStruct->heartSpriteIds[i] = CreateSprite(&sConstestMoveHeartSprite, (i - (i / 4) * 4) * 8 + 104, (i / 4) * 8 + 36, 0); @@ -957,3 +967,23 @@ void MoveRelearnerShowHideHearts(s32 moveId) } } } + +void MoveRelearnerShowHideCategoryIcon(s32 moveId) +{ + if (sMoveRelearnerMenuSate.showContestInfo || moveId == LIST_CANCEL) + { + if (sMoveRelearnerStruct->categoryIconSpriteId != 0xFF) + DestroySprite(&gSprites[sMoveRelearnerStruct->categoryIconSpriteId]); + + sMoveRelearnerStruct->categoryIconSpriteId = 0xFF; + gSprites[sMoveRelearnerStruct->categoryIconSpriteId].invisible = TRUE; + } + else + { + if (sMoveRelearnerStruct->categoryIconSpriteId == 0xFF) + sMoveRelearnerStruct->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 66, 40, 0); + + gSprites[sMoveRelearnerStruct->categoryIconSpriteId].invisible = FALSE; + StartSpriteAnim(&gSprites[sMoveRelearnerStruct->categoryIconSpriteId], GetBattleMoveCategory(moveId)); + } +} From 312749dd3109e607779bb1a15f3669ea2b0979dc Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:44:03 -0700 Subject: [PATCH 051/225] Changed type1 and type2 to be consistent (#2021) * Changed type1 and type2 in gBattleMons to match gSpeciesInfo * Changed monType1 and monType2 to monTypes to match gSpeciesInfo --- include/battle.h | 6 +-- include/battle_controllers.h | 3 +- include/pokemon.h | 3 +- src/battle_ai_script_commands.c | 10 ++--- src/battle_ai_switch_items.c | 4 +- src/battle_controller_player.c | 2 +- src/battle_gfx_sfx_util.c | 2 +- src/battle_main.c | 12 +++--- src/battle_script_commands.c | 68 ++++++++++++++++----------------- src/pokemon.c | 4 +- 10 files changed, 56 insertions(+), 58 deletions(-) diff --git a/include/battle.h b/include/battle.h index 6c4d780186..eb25b96550 100644 --- a/include/battle.h +++ b/include/battle.h @@ -465,11 +465,11 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #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 IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].types[0] == type || gBattleMons[battlerId].types[1] == type)) #define SET_BATTLER_TYPE(battlerId, type) \ { \ - gBattleMons[battlerId].type1 = type; \ - gBattleMons[battlerId].type2 = type; \ + gBattleMons[battlerId].types[0] = type; \ + gBattleMons[battlerId].types[1] = type; \ } #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 064c080f61..0024e006b6 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -124,8 +124,7 @@ struct ChooseMoveStruct u8 currentPp[MAX_MON_MOVES]; u8 maxPp[MAX_MON_MOVES]; u16 species; - u8 monType1; - u8 monType2; + u8 monTypes[2]; }; enum diff --git a/include/pokemon.h b/include/pokemon.h index 6d08f48746..771d947f0a 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -276,8 +276,7 @@ struct BattlePokemon /*0x17*/ u32 abilityNum:1; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; /*0x20*/ u8 ability; - /*0x21*/ u8 type1; - /*0x22*/ u8 type2; + /*0x21*/ u8 types[2]; /*0x23*/ u8 unknown; /*0x24*/ u8 pp[MAX_MON_MOVES]; /*0x28*/ u16 hp; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 4cb4c51654..716c456794 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1119,16 +1119,16 @@ static void Cmd_get_type(void) switch (typeVar) { case AI_TYPE1_USER: // AI user primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type1; + AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].types[0]; break; case AI_TYPE1_TARGET: // target primary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1; + AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].types[0]; break; case AI_TYPE2_USER: // AI user secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type2; + AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].types[1]; break; case AI_TYPE2_TARGET: // target secondary type - AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2; + AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].types[1]; break; case AI_TYPE_MOVE: // type of move being pointed to AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; @@ -1527,7 +1527,7 @@ static void Cmd_if_type_effectiveness(void) // TypeCalc does not assign to gMoveResultFlags, Cmd_typecalc does // This makes the check for gMoveResultFlags below always fail - // This is how you get the "dual non-immunity" glitch, where AI + // This is how you get the "dual non-immunity" glitch, where AI // will use ineffective moves on immune pokémon if the second type // has a non-neutral, non-immune effectiveness #ifdef BUGFIX diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 5ef15b627a..eeb28f8f0f 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -706,8 +706,8 @@ u8 GetMostSuitableMonToSwitchInto(void) u8 type1 = gSpeciesInfo[species].types[0]; u8 type2 = gSpeciesInfo[species].types[1]; u8 typeDmg = TYPE_MUL_NORMAL; - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].types[0], type1, type2, &typeDmg); + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].types[1], type1, type2, &typeDmg); /* Possible bug: this comparison gives the type that takes the most damage, when a "good" AI would want to select the type that takes the least damage. Unknown if this diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 8e09d126c9..e447858fc8 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -485,7 +485,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->monTypes[0] != TYPE_GHOST && moveInfo->monTypes[1] != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index a17ebcb5ab..ed8cf572ea 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -264,7 +264,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) if (moveInfo->moves[chosenMoveId] == MOVE_CURSE) { - if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) + if (moveInfo->monTypes[0] != TYPE_GHOST && moveInfo->monTypes[1] != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; diff --git a/src/battle_main.c b/src/battle_main.c index c19089deb0..9039655c4d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3343,8 +3343,8 @@ void FaintClearSetData(void) gBattleResources->flags->flags[gActiveBattler] = 0; - gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; + gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; + gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; ClearBattlerMoveHistory(gActiveBattler); ClearBattlerAbilityHistory(gActiveBattler); @@ -3411,8 +3411,8 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) for (i = 0; i < sizeof(struct BattlePokemon); i++) ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; - gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; + gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; + gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; *hpOnSwitchout = gBattleMons[gActiveBattler].hp; @@ -4173,8 +4173,8 @@ static void HandleTurnActionSelectionState(void) struct ChooseMoveStruct moveInfo; moveInfo.species = gBattleMons[gActiveBattler].species; - moveInfo.monType1 = gBattleMons[gActiveBattler].type1; - moveInfo.monType2 = gBattleMons[gActiveBattler].type2; + moveInfo.monTypes[0] = gBattleMons[gActiveBattler].types[0]; + moveInfo.monTypes[1] = gBattleMons[gActiveBattler].types[1]; for (i = 0; i < MAX_MON_MOVES; i++) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 49279bdb9c..6f43c6af70 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1395,11 +1395,11 @@ static void Cmd_typecalc(void) else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0]) ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && - gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] && + gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1]) ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); } i += 3; @@ -1454,14 +1454,14 @@ static void CheckWonderGuardAndLevitate(void) if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check no effect - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0] && 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 && + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] && + gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; @@ -1469,18 +1469,18 @@ static void CheckWonderGuardAndLevitate(void) } // check super effective - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0] && TYPE_EFFECT_MULTIPLIER(i) == 20) flags |= 1; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] + && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && 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) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0] && TYPE_EFFECT_MULTIPLIER(i) == 5) flags |= 2; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] + && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) flags |= 2; } @@ -1570,11 +1570,11 @@ u8 TypeCalc(u16 move, u8 attacker, u8 defender) else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type1) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].types[0]) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type2 && - gBattleMons[defender].type1 != gBattleMons[defender].type2) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].types[1] && + gBattleMons[defender].types[0] != gBattleMons[defender].types[1]) ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); } i += 3; @@ -3971,7 +3971,7 @@ static void Cmd_jumpiftype2(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2) + if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[0] || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[1]) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; @@ -4520,7 +4520,7 @@ static void Cmd_typecalc2(void) if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0]) { if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) { @@ -4537,22 +4537,22 @@ static void Cmd_typecalc2(void) } } // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2) + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1]) { - if (gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 + if (gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && 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 + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] + && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && 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 + if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] + && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) { flags |= MOVE_RESULT_SUPER_EFFECTIVE; @@ -4623,8 +4623,8 @@ static void Cmd_switchindataupdate(void) for (i = 0; i < sizeof(struct BattlePokemon); i++) monData[i] = gBattleBufferB[gActiveBattler][4 + i]; - gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; + gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; + gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); // check knocked off item @@ -7354,8 +7354,8 @@ static void Cmd_tryconversiontypechange(void) else moveType = TYPE_NORMAL; } - if (moveType != gBattleMons[gBattlerAttacker].type1 - && moveType != gBattleMons[gBattlerAttacker].type2) + if (moveType != gBattleMons[gBattlerAttacker].types[0] + && moveType != gBattleMons[gBattlerAttacker].types[1]) { break; } @@ -7381,7 +7381,7 @@ static void Cmd_tryconversiontypechange(void) moveType = TYPE_NORMAL; } } - while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2); + while (moveType == gBattleMons[gBattlerAttacker].types[0] || moveType == gBattleMons[gBattlerAttacker].types[1]); SET_BATTLER_TYPE(gBattlerAttacker, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); @@ -7548,12 +7548,12 @@ static void Cmd_weatherdamage(void) { if (gBattleWeather & B_WEATHER_SANDSTORM) { - 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 + if (gBattleMons[gBattlerAttacker].types[0] != TYPE_ROCK + && gBattleMons[gBattlerAttacker].types[0] != TYPE_STEEL + && gBattleMons[gBattlerAttacker].types[0] != TYPE_GROUND + && gBattleMons[gBattlerAttacker].types[1] != TYPE_ROCK + && gBattleMons[gBattlerAttacker].types[1] != TYPE_STEEL + && gBattleMons[gBattlerAttacker].types[1] != TYPE_GROUND && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) diff --git a/src/pokemon.c b/src/pokemon.c index ef8e7e9e05..077b856793 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4670,8 +4670,8 @@ void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL); gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); - gBattleMons[battlerId].type1 = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; - gBattleMons[battlerId].type2 = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; + gBattleMons[battlerId].types[0] = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; + gBattleMons[battlerId].types[1] = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname); From ce74c85e4f58cd33af45f82eaa598ba8c4622914 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 7 Aug 2024 09:52:40 -0400 Subject: [PATCH 052/225] Move effect TODO tests - Volume C (#5094) --- test/battle/gimmick/dynamax.c | 15 -------- test/battle/move_effect/calm_mind.c | 4 ++ test/battle/move_effect/camouflage.c | 8 ++++ test/battle/move_effect/captivate.c | 7 ++++ test/battle/move_effect/change_type_on_item.c | 6 ++- test/battle/move_effect/charge.c | 9 +++++ test/battle/move_effect/chilly_reception.c | 1 + test/battle/move_effect/clangorous_soul.c | 11 ++++++ test/battle/move_effect/coaching.c | 8 ++++ test/battle/move_effect/coil.c | 6 +++ test/battle/move_effect/conversion.c | 10 +++++ test/battle/move_effect/conversion_2.c | 14 +++++++ test/battle/move_effect/copycat.c | 37 +++++++++++++++++++ test/battle/move_effect/corrosive_gas.c | 3 ++ test/battle/move_effect/cosmic_power.c | 4 ++ test/battle/move_effect/counter.c | 22 +++++++++++ test/battle/move_effect/court_change.c | 23 +++++++----- 17 files changed, 161 insertions(+), 27 deletions(-) create mode 100644 test/battle/move_effect/calm_mind.c create mode 100644 test/battle/move_effect/camouflage.c create mode 100644 test/battle/move_effect/captivate.c create mode 100644 test/battle/move_effect/charge.c create mode 100644 test/battle/move_effect/clangorous_soul.c create mode 100644 test/battle/move_effect/coaching.c create mode 100644 test/battle/move_effect/coil.c create mode 100644 test/battle/move_effect/conversion.c create mode 100644 test/battle/move_effect/conversion_2.c create mode 100644 test/battle/move_effect/copycat.c create mode 100644 test/battle/move_effect/cosmic_power.c create mode 100644 test/battle/move_effect/counter.c diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 56fd2e25ea..dca175c637 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -362,21 +362,6 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon lose their substitutes") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { MOVE(playerLeft, MOVE_TRICK_ROOM, gimmick: GIMMICK_DYNAMAX, target: opponentLeft); MOVE(playerRight, MOVE_COPYCAT, target: opponentLeft); } - } SCENE { - MESSAGE("Wobbuffet used Max Guard!"); - MESSAGE("Wynaut used Trick Room!"); - } -} - SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon take double damage from Dynamax Cannon", s16 damage) { u32 dynamax; diff --git a/test/battle/move_effect/calm_mind.c b/test/battle/move_effect/calm_mind.c new file mode 100644 index 0000000000..66c16361f4 --- /dev/null +++ b/test/battle/move_effect/calm_mind.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Calm Mind increases the user's Sp. Attack and Sp. Defense by 1 stage each"); diff --git a/test/battle/move_effect/camouflage.c b/test/battle/move_effect/camouflage.c new file mode 100644 index 0000000000..a8728e3117 --- /dev/null +++ b/test/battle/move_effect/camouflage.c @@ -0,0 +1,8 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Camouflage changes the type of the user based on battle environment"); +TO_DO_BATTLE_TEST("Camouflage changes the type of the user to Grass if Grassy Terrain is active"); +TO_DO_BATTLE_TEST("Camouflage changes the type of the user to Electric if Electric Terrain is active"); +TO_DO_BATTLE_TEST("Camouflage changes the type of the user to Psychic if Psychic Terrain is active"); +TO_DO_BATTLE_TEST("Camouflage changes the type of the user to Fairy if Misty Terrain is active"); diff --git a/test/battle/move_effect/captivate.c b/test/battle/move_effect/captivate.c new file mode 100644 index 0000000000..0da58983c7 --- /dev/null +++ b/test/battle/move_effect/captivate.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Captivate decreases the target's Sp. Attack if they're opposite gender from the user"); +TO_DO_BATTLE_TEST("Captivate fails if the target and user share gender"); +TO_DO_BATTLE_TEST("Captivate fails if the target is genderless"); +TO_DO_BATTLE_TEST("Captivate fails if the user is genderless"); diff --git a/test/battle/move_effect/change_type_on_item.c b/test/battle/move_effect/change_type_on_item.c index 0bd181cf61..6365215a42 100644 --- a/test/battle/move_effect/change_type_on_item.c +++ b/test/battle/move_effect/change_type_on_item.c @@ -7,8 +7,7 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_TECHNO_BLAST].argument == HOLD_EFFECT_DRIVE); } - -SINGLE_BATTLE_TEST("Techno Blast changes the move type depending on the mask the user holds") +SINGLE_BATTLE_TEST("Techno Blast changes type depending on the drive the user holds") { u16 species; u16 item; @@ -29,3 +28,6 @@ SINGLE_BATTLE_TEST("Techno Blast changes the move type depending on the mask the MESSAGE("It's super effective!"); } } + +TO_DO_BATTLE_TEST("Judgement changes type depending on the plate the user holds"); +TO_DO_BATTLE_TEST("Multi Attack changes type depending on the memory the user holds"); diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c new file mode 100644 index 0000000000..e0a782b15f --- /dev/null +++ b/test/battle/move_effect/charge.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Charge doubles the damage of the next Electric move of the user"); +TO_DO_BATTLE_TEST("Charge's effect is removed regardless if the next move is Electric or not (Gen 3-8)"); +TO_DO_BATTLE_TEST("Charge's effect is kept until the user uses an Electric move (Gen 9+)"); +TO_DO_BATTLE_TEST("Charge's effect is removed if the user fails using an Electric move (Gen 9+)"); +TO_DO_BATTLE_TEST("Charge's effect does not stack with Electromorphosis"); +TO_DO_BATTLE_TEST("Charge's effect does not stack with Wind Power"); diff --git a/test/battle/move_effect/chilly_reception.c b/test/battle/move_effect/chilly_reception.c index f2c50b8444..a52c83eb5d 100644 --- a/test/battle/move_effect/chilly_reception.c +++ b/test/battle/move_effect/chilly_reception.c @@ -88,3 +88,4 @@ SINGLE_BATTLE_TEST("Chilly Reception changes the weather, even if the user canno } } +TO_DO_BATTLE_TEST("Chilly Reception doesn't announce its move if it's called by a different move"); diff --git a/test/battle/move_effect/clangorous_soul.c b/test/battle/move_effect/clangorous_soul.c new file mode 100644 index 0000000000..17e57d7dd5 --- /dev/null +++ b/test/battle/move_effect/clangorous_soul.c @@ -0,0 +1,11 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Attack by 1 stage"); +TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Defense by 1 stage"); +TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Attack by 1 stage"); +TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Defense by 1 stage"); +TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Speed by 1 stage"); +TO_DO_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3"); +TO_DO_BATTLE_TEST("Clangorous Soul fails if Attack, Defense, Sp. Attack, Sp. Defense and Speed are all maxed out"); +TO_DO_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3"); diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c new file mode 100644 index 0000000000..2f50aceab5 --- /dev/null +++ b/test/battle/move_effect/coaching.c @@ -0,0 +1,8 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Coaching raises Attack and Defense of ally by 1 stage each"); +TO_DO_BATTLE_TEST("Coaching doesn't raise stats of the user"); +TO_DO_BATTLE_TEST("Coaching bypasses protection of allies"); +TO_DO_BATTLE_TEST("Coaching fails in single battles"); +TO_DO_BATTLE_TEST("Coaching fails if there's no ally"); diff --git a/test/battle/move_effect/coil.c b/test/battle/move_effect/coil.c new file mode 100644 index 0000000000..ce9e8629a8 --- /dev/null +++ b/test/battle/move_effect/coil.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Coil raises the user's Attack by 1 stage"); +TO_DO_BATTLE_TEST("Coil raises the user's Defense by 1 stage"); +TO_DO_BATTLE_TEST("Coil raises the user's Accuracy by 1 stage"); diff --git a/test/battle/move_effect/conversion.c b/test/battle/move_effect/conversion.c new file mode 100644 index 0000000000..ac863cf2b2 --- /dev/null +++ b/test/battle/move_effect/conversion.c @@ -0,0 +1,10 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Conversion changes the user's types to the target's current types (Gen 1)"); +TO_DO_BATTLE_TEST("Conversion changes the user's types randomly to one of the user's move (Gen 2-5)"); +TO_DO_BATTLE_TEST("Conversion ignores moves that share types with the user (Gen 2-5)"); +TO_DO_BATTLE_TEST("Conversion fails if all the user's moves share types with the user (Gen 2-5)"); +TO_DO_BATTLE_TEST("Conversion changes the user's types to the one in the user's first slot (Gen 6+)"); +TO_DO_BATTLE_TEST("Conversion can read the user's first move slot even if that move cannot be selected (Gen 6+)"); //Eg. Disable +TO_DO_BATTLE_TEST("Conversion can change the user's types to Conversion's type"); diff --git a/test/battle/move_effect/conversion_2.c b/test/battle/move_effect/conversion_2.c new file mode 100644 index 0000000000..2e81212ef1 --- /dev/null +++ b/test/battle/move_effect/conversion_2.c @@ -0,0 +1,14 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 3-4)"); +TO_DO_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move used by the target (Gen 5+)"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers dynamic type moves"); // Eg. Weather Ball +TO_DO_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 3-4)"); +TO_DO_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)"); +TO_DO_BATTLE_TEST("Conversion 2's type change considers Inverse Battles"); +TO_DO_BATTLE_TEST("Conversion 2 fails if the move used is Stellar Type"); diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c new file mode 100644 index 0000000000..cdc164cd0f --- /dev/null +++ b/test/battle/move_effect/copycat.c @@ -0,0 +1,37 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Copycat causes the user to use the last move used in battle"); +TO_DO_BATTLE_TEST("Copycat can call the user's last move used if it was the last move used in battle"); +TO_DO_BATTLE_TEST("Copycat fails if no move has been made"); +TO_DO_BATTLE_TEST("Copycat chooses a target at random if the copied move wasn't the user's"); +TO_DO_BATTLE_TEST("Copycat can copy moves regardless if they failed or not"); //Has "X used move!" +TO_DO_BATTLE_TEST("Copycat fails if the last move used is a Z-Move"); + +// Gen 4 +TO_DO_BATTLE_TEST("Copycat can only copy charging moves after it has been executed (Gen 4)"); +TO_DO_BATTLE_TEST("Copycat can only copy recharging moves after it has been executed (Gen 4)"); +TO_DO_BATTLE_TEST("Copycat cannot copy Bide's final turn (Gen 4)"); +TO_DO_BATTLE_TEST("Copycat copies other calling moves instead of the move they called (Gen 4)"); +TO_DO_BATTLE_TEST("Copycat copies moves called by other calling moves instead of the calling move if they are executed in a second turn (Gen 5+)"); //Eg. Dig + +// Gen 5+ +TO_DO_BATTLE_TEST("Copycat can copy charging moves in both the charging and the executing turn (Gen 5+)"); +TO_DO_BATTLE_TEST("Copycat ignores the recharging turn of recharging moves (Gen 5+)"); +TO_DO_BATTLE_TEST("Copycat can copy Bide on all turns"); +TO_DO_BATTLE_TEST("Copycat copies moves called by other calling moves instead of the calling move (Gen 5+)"); + +DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TRICK_ROOM, gimmick: GIMMICK_DYNAMAX, target: opponentLeft); MOVE(playerRight, MOVE_COPYCAT, target: opponentLeft); } + } SCENE { + MESSAGE("Wobbuffet used Max Guard!"); + MESSAGE("Wynaut used Trick Room!"); + } +} diff --git a/test/battle/move_effect/corrosive_gas.c b/test/battle/move_effect/corrosive_gas.c index 714702703a..f6a9c738e4 100644 --- a/test/battle/move_effect/corrosive_gas.c +++ b/test/battle/move_effect/corrosive_gas.c @@ -117,3 +117,6 @@ DOUBLE_BATTLE_TEST("Corrosive Gas destroys foes and ally's items if they have on EXPECT_EQ(opponentRight->item, ITEM_NONE); } } + +TO_DO_BATTLE_TEST("Corrosive Gas doesn't destroy the item of a Pokemon behind a Substitute"); +TO_DO_BATTLE_TEST("Corrosive Gas doesn't destroy items if they change the Pokémon's form"); // Giratina, Genesect, Silvally, Zacian, Zamazenta. Bulbapedia hasn't confirmed Arceus or Ogerpon, but it's a safe assumption that they will also fail. diff --git a/test/battle/move_effect/cosmic_power.c b/test/battle/move_effect/cosmic_power.c new file mode 100644 index 0000000000..8680e9f28e --- /dev/null +++ b/test/battle/move_effect/cosmic_power.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Cosmic Power increases the user's Defense and Sp. Defense by 1 stage each"); diff --git a/test/battle/move_effect/counter.c b/test/battle/move_effect/counter.c new file mode 100644 index 0000000000..f4d3a78114 --- /dev/null +++ b/test/battle/move_effect/counter.c @@ -0,0 +1,22 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Counter will do twice as much damage received from the opponent"); +TO_DO_BATTLE_TEST("Counter cannot affect ally Pokémon"); +TO_DO_BATTLE_TEST("Counter hits the last opponent that hit the user"); //Doubles + +// Gen 1 +TO_DO_BATTLE_TEST("Counter can only counter Normal and Fighting-type moves (Gen 1)"); +TO_DO_BATTLE_TEST("Counter can hit ghost-type Pokémon (Gen 1)"); +TO_DO_BATTLE_TEST("Counter can return damage dealt to a substitute (Gen 1)"); + +// Gen 2-3 +TO_DO_BATTLE_TEST("Counter can counter Hidden Power regardless of type (Gen 2-3)"); + +// Gen 2+ +TO_DO_BATTLE_TEST("Counter can only counter physical moves (Gen 2+)"); +TO_DO_BATTLE_TEST("Counter cannot hit ghost-type Pokémon (Gen 2+)"); +TO_DO_BATTLE_TEST("Counter cannot return damage dealt to a substitute (Gen 2+)"); + +// Triple Battles required to test +//TO_DO_BATTLE_TEST("Counter can hit non-adjacent opponents if they were the last Pokémon to hit the user"); diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index a5e3e05619..b9be19db7f 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") } } -DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Lucky Chant, Reflect, Light Screen, Tailwind") +DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { PLAYER(SPECIES_WYNAUT); @@ -88,8 +88,8 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Lucky OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponentLeft, MOVE_MIST); MOVE(opponentRight, MOVE_SAFEGUARD); } - TURN { MOVE(opponentLeft, MOVE_LUCKY_CHANT); MOVE(opponentRight, MOVE_REFLECT); } + TURN { MOVE(playerLeft, MOVE_SNOWSCAPE); MOVE(opponentLeft, MOVE_MIST); MOVE(opponentRight, MOVE_SAFEGUARD); } + TURN { MOVE(opponentLeft, MOVE_AURORA_VEIL); MOVE(opponentRight, MOVE_REFLECT); } TURN { MOVE(opponentLeft, MOVE_LIGHT_SCREEN); MOVE(opponentRight, MOVE_TAILWIND); } TURN { MOVE(playerLeft, MOVE_COURT_CHANGE); } TURN { } @@ -97,9 +97,10 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Lucky TURN { } TURN { } } SCENE { + MESSAGE("Wynaut used Snowscape!"); MESSAGE("Foe Wobbuffet used Mist!"); MESSAGE("Foe Wobbuffet used Safeguard!"); - MESSAGE("Foe Wobbuffet used Lucky Chant!"); + MESSAGE("Foe Wobbuffet used Aurora Veil!"); MESSAGE("Foe Wobbuffet used Reflect!"); MESSAGE("Foe Wobbuffet used Light Screen!"); MESSAGE("Foe Wobbuffet used Tailwind!"); @@ -109,13 +110,13 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Lucky MESSAGE("Ally's Mist wore off!"); MESSAGE("Ally's party is no longer protected by Safeguard!"); MESSAGE("Ally's Reflect wore off!"); - MESSAGE("Your team's Lucky Chant wore off!"); + MESSAGE("Ally's Aurora Veil wore off!"); MESSAGE("Your team's tailwind petered out!"); MESSAGE("Ally's Light Screen wore off!"); } } -DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Lucky Chant, Reflect, Light Screen, Tailwind") +DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -125,8 +126,8 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Luc OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); } WHEN { - TURN { MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); } - TURN { MOVE(playerLeft, MOVE_LUCKY_CHANT); MOVE(playerRight, MOVE_REFLECT); } + TURN { MOVE(opponentLeft, MOVE_SNOWSCAPE); MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); } + TURN { MOVE(playerLeft, MOVE_AURORA_VEIL); MOVE(playerRight, MOVE_REFLECT); } TURN { MOVE(playerLeft, MOVE_LIGHT_SCREEN); MOVE(playerRight, MOVE_TAILWIND); } TURN { MOVE(opponentLeft, MOVE_COURT_CHANGE); } TURN { } @@ -136,7 +137,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Luc } SCENE { MESSAGE("Wobbuffet used Mist!"); MESSAGE("Wobbuffet used Safeguard!"); - MESSAGE("Wobbuffet used Lucky Chant!"); + MESSAGE("Wobbuffet used Aurora Veil!"); MESSAGE("Wobbuffet used Reflect!"); MESSAGE("Wobbuffet used Light Screen!"); MESSAGE("Wobbuffet used Tailwind!"); @@ -146,8 +147,10 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Luc MESSAGE("Foe's Mist wore off!"); MESSAGE("Foe's party is no longer protected by Safeguard!"); MESSAGE("Foe's Reflect wore off!"); - MESSAGE("The opposing team's Lucky Chant wore off!"); + MESSAGE("Foe's Aurora Veil wore off!"); MESSAGE("The opposing team's tailwind petered out!"); MESSAGE("Foe's Light Screen wore off!"); } } + +TO_DO_BATTLE_TEST("Court Change used by the player swaps G-Max Steelsurge, G-Max Vine Lash, G-Max Wildfire, G-Max Cannonade"); From 9f845a79e5657e3238291b0e270671fc2b997030 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 7 Aug 2024 09:58:39 -0400 Subject: [PATCH 053/225] Fix Switch AI Bug: AI never switching out when it could be OHKO'd (#5089) * Fix switch AI bug * Forgot to save a file lol * Fix infinite loop test compatibility --- include/random.h | 1 + src/battle_ai_switch_items.c | 10 +++++----- test/battle/ai/ai_switching.c | 20 +++++++++++++++++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/include/random.h b/include/random.h index cb4e636e14..cd7e26b589 100644 --- a/include/random.h +++ b/include/random.h @@ -197,6 +197,7 @@ enum RandomTag RNG_TRACE, RNG_FICKLE_BEAM, RNG_AI_ABILITY, + RNG_AI_HASBADODDS, RNG_SHELL_SIDE_ARM, }; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a0a44cb98d..d23c0c1e32 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -148,8 +148,8 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) playerMove = gBattleMons[opposingBattler].moves[i]; if (playerMove != MOVE_NONE && gMovesInfo[playerMove].power != 0) { - struct SimulatedDamage dmg = AI_CalcDamage(playerMove, opposingBattler, battler, &effectiveness, FALSE, weather, DMG_ROLL_HIGHEST); - if (dmg.expected > maxDamageTaken) + damageTaken = AI_CalcDamage(playerMove, opposingBattler, battler, &effectiveness, FALSE, weather, DMG_ROLL_HIGHEST).expected; + if (damageTaken > maxDamageTaken) maxDamageTaken = damageTaken; } } @@ -172,7 +172,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) return FALSE; // Start assessing whether or not mon has bad odds - // Jump straight to swtiching out in cases where mon gets OHKO'd + // Jump straight to switching out in cases where mon gets OHKO'd if (((getsOneShot && gBattleMons[opposingBattler].speed > gBattleMons[battler].speed) // If the player OHKOs and outspeeds OR OHKOs, doesn't outspeed but isn't 2HKO'd || (getsOneShot && gBattleMons[opposingBattler].speed <= gBattleMons[battler].speed && maxDamageDealt < gBattleMons[opposingBattler].hp / 2)) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator @@ -180,7 +180,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless - if (Random() % 2 == 0) + if (!RandomPercentage(RNG_AI_HASBADODDS, 50)) return FALSE; // Switch mon out @@ -203,7 +203,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) return FALSE; // 50% chance to stay in regardless - if (Random() % 2 == 0) + if (!RandomPercentage(RNG_AI_HASBADODDS, 50)) return FALSE; // Switch mon out diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index fcc8e322ca..b3927509f0 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -121,7 +121,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Avoid infinite loop if damage { GIVEN { ASSUME(gItemsInfo[ITEM_LEFTOVERS].holdEffect == HOLD_EFFECT_LEFTOVERS); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_MEOWTH_GALARIAN) { Level(100); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } // Scenario courtesy of Duke, who triggered the bug in the first place OPPONENT(SPECIES_MEOWTH_GALARIAN) { Level(5); Moves(MOVE_GROWL, MOVE_FAKE_OUT, MOVE_HONE_CLAWS); } @@ -357,3 +357,21 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would be OKHO'd and they have a good switchin 50% of the time") +{ + PASSES_RANDOMLY(50, 100, RNG_AI_HASBADODDS); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); + ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); + ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[1] == TYPE_FLYING); + ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].type == TYPE_GROUND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_ELECTRODE) { Moves(MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK); } + OPPONENT(SPECIES_PELIPPER) { Moves(MOVE_EARTHQUAKE); }; + OPPONENT(SPECIES_RHYDON) { Moves(MOVE_EARTHQUAKE); Ability(ABILITY_ROCK_HEAD); } + } WHEN { + TURN { MOVE(player, MOVE_THUNDERBOLT) ; EXPECT_SWITCH(opponent, 1); } + } +} From 5635f9403639c83d7895e1ffe5ec3bc1789f1bf1 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Wed, 7 Aug 2024 11:35:45 -0700 Subject: [PATCH 054/225] More changes from typeX to types[X] --- include/battle.h | 25 +- include/battle_controllers.h | 8 +- include/pokemon.h | 24 +- src/battle_ai_switch_items.c | 40 +- src/battle_ai_util.c | 16 +- src/battle_controller_player.c | 12 +- src/battle_debug.c | 6 +- src/battle_gfx_sfx_util.c | 18 +- src/battle_main.c | 62 +--- src/battle_script_commands.c | 488 ++----------------------- src/battle_util.c | 20 +- src/battle_z_move.c | 2 +- src/pokemon.c | 40 +- test/battle/move_effect/reflect_type.c | 20 +- test/battle/terrain/electric.c | 2 +- test/battle/terrain/grassy.c | 2 +- test/battle/terrain/misty.c | 2 +- test/battle/terrain/psychic.c | 2 +- 18 files changed, 107 insertions(+), 682 deletions(-) diff --git a/include/battle.h b/include/battle.h index 25b5e8db4f..090ae5c347 100644 --- a/include/battle.h +++ b/include/battle.h @@ -834,29 +834,16 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define SET_BATTLER_TYPE(battlerId, type) \ { \ - gBattleMons[battlerId].type1 = type; \ - gBattleMons[battlerId].type2 = type; \ - gBattleMons[battlerId].type3 = TYPE_MYSTERY; \ + gBattleMons[battlerId].types[0] = type; \ + gBattleMons[battlerId].types[1] = type; \ + gBattleMons[battlerId].types[2] = TYPE_MYSTERY; \ } -<<<<<<< HEAD #define RESTORE_BATTLER_TYPE(battlerId) \ { \ - gBattleMons[battlerId].type1 = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; \ - gBattleMons[battlerId].type2 = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; \ - gBattleMons[battlerId].type3 = TYPE_MYSTERY; \ -======= -#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) -#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY) - -#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0)) - -#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].types[0] == type || gBattleMons[battlerId].types[1] == type)) -#define SET_BATTLER_TYPE(battlerId, type) \ -{ \ - gBattleMons[battlerId].types[0] = type; \ - gBattleMons[battlerId].types[1] = type; \ ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc + gBattleMons[battlerId].types[0] = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; \ + gBattleMons[battlerId].types[1] = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; \ + gBattleMons[battlerId].types[2] = TYPE_MYSTERY; \ } #define IS_BATTLER_PROTECTED(battlerId)(gProtectStructs[battlerId].protected \ diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 7a08aa4b2d..71a7691448 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -125,14 +125,8 @@ struct ChooseMoveStruct u8 currentPp[MAX_MON_MOVES]; u8 maxPp[MAX_MON_MOVES]; u16 species; -<<<<<<< HEAD - u8 monType1; - u8 monType2; - u8 monType3; + u8 monTypes[3]; struct ZMoveData zmove; -======= - u8 monTypes[2]; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc }; enum diff --git a/include/pokemon.h b/include/pokemon.h index 9b0c6fa618..d1484fe2ce 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -322,11 +322,8 @@ struct BattlePokemon /*0x17*/ u32 spDefenseIV:5; /*0x17*/ u32 abilityNum:2; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; -<<<<<<< HEAD /*0x20*/ u16 ability; - /*0x22*/ u8 type1; - /*0x23*/ u8 type2; - /*0x24*/ u8 type3; + /*0x22*/ u8 types[3]; /*0x25*/ u8 pp[MAX_MON_MOVES]; /*0x29*/ u16 hp; /*0x2B*/ u8 level; @@ -343,25 +340,6 @@ struct BattlePokemon /*0x55*/ u32 otId; /*0x59*/ u8 metLevel; /*0x5A*/ bool8 isShiny; -======= - /*0x20*/ u8 ability; - /*0x21*/ u8 types[2]; - /*0x23*/ u8 unknown; - /*0x24*/ u8 pp[MAX_MON_MOVES]; - /*0x28*/ u16 hp; - /*0x2A*/ u8 level; - /*0x2B*/ u8 friendship; - /*0x2C*/ u16 maxHP; - /*0x2E*/ u16 item; - /*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; - /*0x3B*/ u8 ppBonuses; - /*0x3C*/ u8 otName[PLAYER_NAME_LENGTH + 1]; - /*0x44*/ u32 experience; - /*0x48*/ u32 personality; - /*0x4C*/ u32 status1; - /*0x50*/ u32 status2; - /*0x54*/ u32 otId; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc }; struct Evolution diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index e561ac76fb..29642df9ff 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -89,10 +89,10 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) opposingBattler = GetBattlerAtPosition(opposingPosition); // Gets types of player (opposingBattler) and computer (battler) - atkType1 = gBattleMons[opposingBattler].type1; - atkType2 = gBattleMons[opposingBattler].type2; - defType1 = gBattleMons[battler].type1; - defType2 = gBattleMons[battler].type2; + atkType1 = gBattleMons[opposingBattler].types[0]; + atkType2 = gBattleMons[opposingBattler].types[1]; + defType1 = gBattleMons[battler].types[0]; + defType2 = gBattleMons[battler].types[1]; // Check AI moves for damage dealt for (i = 0; i < MAX_MON_MOVES; i++) @@ -1233,19 +1233,11 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, { if (!(gBitTable[i] & invalidMons) && !(gBitTable[i] & bits)) { -<<<<<<< HEAD u16 species = GetMonData(&party[i], MON_DATA_SPECIES); uq4_12_t typeEffectiveness = UQ_4_12(1.0); -======= - u8 type1 = gSpeciesInfo[species].types[0]; - u8 type2 = gSpeciesInfo[species].types[1]; - u8 typeDmg = TYPE_MUL_NORMAL; - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].types[0], type1, type2, &typeDmg); - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].types[1], type1, type2, &typeDmg); ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc - u8 atkType1 = gBattleMons[opposingBattler].type1; - u8 atkType2 = gBattleMons[opposingBattler].type2; + u8 atkType1 = gBattleMons[opposingBattler].types[0]; + u8 atkType2 = gBattleMons[opposingBattler].types[1]; u8 defType1 = gSpeciesInfo[species].types[0]; u8 defType2 = gSpeciesInfo[species].types[1]; @@ -1345,7 +1337,7 @@ static bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) // Gets hazard damage static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon) { - u8 defType1 = battleMon->type1, defType2 = battleMon->type2, tSpikesLayers; + u8 defType1 = battleMon->types[0], defType2 = battleMon->types[1], tSpikesLayers; u16 heldItemEffect = ItemId_GetHoldEffect(battleMon->item); u32 maxHP = battleMon->maxHP, ability = battleMon->ability, status = battleMon->status1; u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0; @@ -1412,7 +1404,7 @@ static s32 GetSwitchinWeatherImpact(void) if (holdEffect != HOLD_EFFECT_SAFETY_GOGGLES && ability != ABILITY_MAGIC_GUARD && ability != ABILITY_OVERCOAT) { if ((gBattleWeather & B_WEATHER_HAIL) - && (AI_DATA->switchinCandidate.battleMon.type1 != TYPE_ICE || AI_DATA->switchinCandidate.battleMon.type2 != TYPE_ICE) + && (AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_ICE || AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_ICE) && ability != ABILITY_SNOW_CLOAK && ability != ABILITY_ICE_BODY) { weatherImpact = maxHP / 16; @@ -1420,9 +1412,9 @@ static s32 GetSwitchinWeatherImpact(void) weatherImpact = 1; } else if ((gBattleWeather & B_WEATHER_SANDSTORM) - && (AI_DATA->switchinCandidate.battleMon.type1 != TYPE_GROUND && AI_DATA->switchinCandidate.battleMon.type2 != TYPE_GROUND - && AI_DATA->switchinCandidate.battleMon.type1 != TYPE_ROCK && AI_DATA->switchinCandidate.battleMon.type2 != TYPE_ROCK - && AI_DATA->switchinCandidate.battleMon.type1 != TYPE_STEEL && AI_DATA->switchinCandidate.battleMon.type2 != TYPE_STEEL + && (AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_GROUND && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_GROUND + && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_ROCK && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_ROCK + && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_STEEL && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_STEEL && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_RUSH && ability != ABILITY_SAND_FORCE)) { weatherImpact = maxHP / 16; @@ -1473,7 +1465,7 @@ static u32 GetSwitchinRecurringHealing(void) // Items if (ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && (AI_DATA->switchinCandidate.battleMon.type1 == TYPE_POISON || AI_DATA->switchinCandidate.battleMon.type2 == TYPE_POISON)) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && (AI_DATA->switchinCandidate.battleMon.types[0] == TYPE_POISON || AI_DATA->switchinCandidate.battleMon.types[1] == TYPE_POISON)) { recurringHealing = maxHP / 16; if (recurringHealing == 0) @@ -1507,7 +1499,7 @@ static u32 GetSwitchinRecurringDamage(void) // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && AI_DATA->switchinCandidate.battleMon.type1 != TYPE_POISON && AI_DATA->switchinCandidate.battleMon.type2 != TYPE_POISON) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_POISON && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_POISON) { passiveDamage = maxHP / 8; if (passiveDamage == 0) @@ -1532,7 +1524,7 @@ static u32 GetSwitchinRecurringDamage(void) // Gets one turn of status damage static u32 GetSwitchinStatusDamage(u32 battler) { - u8 defType1 = AI_DATA->switchinCandidate.battleMon.type1, defType2 = AI_DATA->switchinCandidate.battleMon.type2; + u8 defType1 = AI_DATA->switchinCandidate.battleMon.types[0], defType2 = AI_DATA->switchinCandidate.battleMon.types[1]; u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; u16 heldItemEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); u32 status = AI_DATA->switchinCandidate.battleMon.status1, ability = AI_DATA->switchinCandidate.battleMon.ability, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP; @@ -1714,7 +1706,7 @@ static u16 GetSwitchinTypeMatchup(u32 opposingBattler, struct BattlePokemon batt // Check type matchup u16 typeEffectiveness = UQ_4_12(1.0); u8 atkType1 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[0], atkType2 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[1], - defType1 = battleMon.type1, defType2 = battleMon.type2; + defType1 = battleMon.types[0], defType2 = battleMon.types[1]; // Multiply type effectiveness by a factor depending on type matchup typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); @@ -2010,7 +2002,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, if (aceMonId != PARTY_SIZE && (gMovesInfo[gLastUsedMove].effect == EFFECT_HIT_ESCAPE || gMovesInfo[gLastUsedMove].effect == EFFECT_PARTING_SHOT || gMovesInfo[gLastUsedMove].effect == EFFECT_BATON_PASS)) return aceMonId; - + return PARTY_SIZE; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5505bbed18..f138252fa8 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -165,8 +165,8 @@ void SaveBattlerData(u32 battlerId) AI_THINKING_STRUCT->saved[battlerId].moves[i] = gBattleMons[battlerId].moves[i]; } // Save and restore types even for AI controlled battlers in case it gets changed during move evaluation process. - AI_THINKING_STRUCT->saved[battlerId].types[0] = gBattleMons[battlerId].type1; - AI_THINKING_STRUCT->saved[battlerId].types[1] = gBattleMons[battlerId].type2; + AI_THINKING_STRUCT->saved[battlerId].types[0] = gBattleMons[battlerId].types[0]; + AI_THINKING_STRUCT->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; } static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) @@ -218,11 +218,11 @@ void SetBattlerData(u32 battlerId) if (illusionSpecies != SPECIES_NONE && ShouldFailForIllusion(illusionSpecies, battlerId)) { // If the battler's type has not been changed, AI assumes the types of the illusion mon. - if (gBattleMons[battlerId].type1 == gSpeciesInfo[species].types[0] - && gBattleMons[battlerId].type2 == gSpeciesInfo[species].types[1]) + if (gBattleMons[battlerId].types[0] == gSpeciesInfo[species].types[0] + && gBattleMons[battlerId].types[1] == gSpeciesInfo[species].types[1]) { - gBattleMons[battlerId].type1 = gSpeciesInfo[illusionSpecies].types[0]; - gBattleMons[battlerId].type2 = gSpeciesInfo[illusionSpecies].types[1]; + gBattleMons[battlerId].types[0] = gSpeciesInfo[illusionSpecies].types[0]; + gBattleMons[battlerId].types[1] = gSpeciesInfo[illusionSpecies].types[1]; } species = illusionSpecies; } @@ -262,8 +262,8 @@ void RestoreBattlerData(u32 battlerId) for (i = 0; i < 4; i++) gBattleMons[battlerId].moves[i] = AI_THINKING_STRUCT->saved[battlerId].moves[i]; } - gBattleMons[battlerId].type1 = AI_THINKING_STRUCT->saved[battlerId].types[0]; - gBattleMons[battlerId].type2 = AI_THINKING_STRUCT->saved[battlerId].types[1]; + gBattleMons[battlerId].types[0] = AI_THINKING_STRUCT->saved[battlerId].types[0]; + gBattleMons[battlerId].types[1] = AI_THINKING_STRUCT->saved[battlerId].types[1]; } u32 GetHealthPercentage(u32 battlerId) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 5c37a4661b..5fac761cf7 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -606,19 +606,9 @@ static void HandleInputShowEntireFieldTargets(u32 battler) if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); -<<<<<<< HEAD HideAllTargets(); if (gBattleStruct->gimmick.playerSelect) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); -======= - if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE) - { - if (moveInfo->monTypes[0] != TYPE_GHOST && moveInfo->monTypes[1] != TYPE_GHOST) - moveTarget = MOVE_TARGET_USER; - else - moveTarget = MOVE_TARGET_SELECTED; - } ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc else BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); @@ -1743,7 +1733,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) if (speciesId == SPECIES_OGERPON_WELLSPRING_MASK || speciesId == SPECIES_OGERPON_WELLSPRING_MASK_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK_TERA) - type = gBattleMons[battler].type2; + type = gBattleMons[battler].types[1]; } // Max Guard is a Normal-type move else if (gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].category == DAMAGE_CATEGORY_STATUS diff --git a/src/battle_debug.c b/src/battle_debug.c index 4aefb2b1ff..b088aa73ba 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1670,7 +1670,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) case LIST_ITEM_TYPES: for (i = 0; i < 3; i++) { - u8 *types = &gBattleMons[data->battlerId].type1; + u8 *types = &gBattleMons[data->battlerId].types[0]; PadString(gTypesInfo[types[i]].name, text); printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; @@ -2070,9 +2070,9 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) 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.modifiedValPtr = (u8 *)((&gBattleMons[data->battlerId].types[0]) + data->currentSecondaryListItemId); data->modifyArrows.typeOfVal = VAL_U8; - data->modifyArrows.currValue = *(u8 *)((&gBattleMons[data->battlerId].type1) + data->currentSecondaryListItemId); + data->modifyArrows.currValue = *(u8 *)((&gBattleMons[data->battlerId].types[0]) + data->currentSecondaryListItemId); break; case LIST_ITEM_STATS: data->modifyArrows.minValue = 0; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 5f36549faf..cb3349ee32 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -262,21 +262,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) } } -<<<<<<< HEAD moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[chosenMoveId]); -======= - if (moveInfo->moves[chosenMoveId] == MOVE_CURSE) - { - if (moveInfo->monTypes[0] != TYPE_GHOST && moveInfo->monTypes[1] != TYPE_GHOST) - moveTarget = MOVE_TARGET_USER; - else - moveTarget = MOVE_TARGET_SELECTED; - } - else - { - moveTarget = gBattleMoves[moveInfo->moves[chosenMoveId]].target; - } ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc if (moveTarget & MOVE_TARGET_USER) chosenMoveId |= (battler << 8); @@ -1128,7 +1114,7 @@ void LoadAndCreateEnemyShadowSprites(void) u32 i; LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); - + // initialize shadow sprite ids for (i = 0; i < gBattlersCount; i++) { @@ -1137,7 +1123,7 @@ void LoadAndCreateEnemyShadowSprites(void) battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); CreateEnemyShadowSprite(battler); - + if (IsDoubleBattle()) { battler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); diff --git a/src/battle_main.c b/src/battle_main.c index b42a624861..6bbcc0e3bc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3368,14 +3368,9 @@ const u8* FaintClearSetData(u32 battler) gBattleResources->flags->flags[battler] = 0; -<<<<<<< HEAD - gBattleMons[battler].type1 = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].types[1]; - gBattleMons[battler].type3 = TYPE_MYSTERY; -======= - gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc + gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; + gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[2] = TYPE_MYSTERY; Ai_UpdateFaintData(battler); TryBattleFormChange(battler, FORM_CHANGE_FAINT); @@ -3453,29 +3448,12 @@ static void DoBattleIntro(void) case 2: // Start graphical intro slide. if (!gBattleControllerExecFlags) { -<<<<<<< HEAD battler = GetBattlerAtPosition(0); BtlController_EmitIntroSlide(battler, BUFFER_A, gBattleTerrain); MarkBattlerForControllerExec(battler); gBattleCommunication[0] = 0; gBattleCommunication[1] = 0; (*state)++; -======= - u16 *hpOnSwitchout; - - ptr = (u8 *)&gBattleMons[gActiveBattler]; - for (i = 0; i < sizeof(struct BattlePokemon); i++) - ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; - - gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); - hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; - *hpOnSwitchout = gBattleMons[gActiveBattler].hp; - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; - gBattleMons[gActiveBattler].status2 = 0; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc } break; case 3: // Wait for intro slide. @@ -3492,9 +3470,9 @@ static void DoBattleIntro(void) else { memcpy(&gBattleMons[battler], &gBattleResources->bufferB[battler][4], sizeof(struct BattlePokemon)); - gBattleMons[battler].type1 = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].types[1]; - gBattleMons[battler].type3 = TYPE_MYSTERY; + gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; + gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp; gBattleMons[battler].status2 = 0; @@ -4283,17 +4261,11 @@ static void HandleTurnActionSelectionState(void) { struct ChooseMoveStruct moveInfo; -<<<<<<< HEAD moveInfo.zmove = gBattleStruct->zmove; moveInfo.species = gBattleMons[battler].species; - moveInfo.monType1 = gBattleMons[battler].type1; - moveInfo.monType2 = gBattleMons[battler].type2; - moveInfo.monType3 = gBattleMons[battler].type3; -======= - moveInfo.species = gBattleMons[gActiveBattler].species; - moveInfo.monTypes[0] = gBattleMons[gActiveBattler].types[0]; - moveInfo.monTypes[1] = gBattleMons[gActiveBattler].types[1]; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc + moveInfo.monTypes[0] = gBattleMons[battler].types[0]; + moveInfo.monTypes[1] = gBattleMons[battler].types[1]; + moveInfo.monTypes[2] = gBattleMons[battler].types[2]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -5856,26 +5828,26 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) { if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GetBattlerTeraType(battlerAtk) != TYPE_STELLAR) gBattleStruct->dynamicMoveType = GetBattlerTeraType(battlerAtk); - else if (gBattleMons[battlerAtk].type1 != TYPE_MYSTERY) - gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type1 | F_DYNAMIC_TYPE_SET; - else if (gBattleMons[battlerAtk].type2 != TYPE_MYSTERY) - gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type2 | F_DYNAMIC_TYPE_SET; - else if (gBattleMons[battlerAtk].type3 != TYPE_MYSTERY) - gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type3 | F_DYNAMIC_TYPE_SET; + else if (gBattleMons[battlerAtk].types[0] != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[0] | F_DYNAMIC_TYPE_SET; + else if (gBattleMons[battlerAtk].types[1] != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[1] | F_DYNAMIC_TYPE_SET; + else if (gBattleMons[battlerAtk].types[2] != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[2] | F_DYNAMIC_TYPE_SET; } else if (gMovesInfo[move].effect == EFFECT_RAGING_BULL && (gBattleMons[battlerAtk].species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED || gBattleMons[battlerAtk].species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED || gBattleMons[battlerAtk].species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) { - gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type2 | F_DYNAMIC_TYPE_SET; + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[1] | F_DYNAMIC_TYPE_SET; } else if (gMovesInfo[move].effect == EFFECT_IVY_CUDGEL && (gBattleMons[battlerAtk].species == SPECIES_OGERPON_WELLSPRING_MASK || gBattleMons[battlerAtk].species == SPECIES_OGERPON_WELLSPRING_MASK_TERA || gBattleMons[battlerAtk].species == SPECIES_OGERPON_HEARTHFLAME_MASK || gBattleMons[battlerAtk].species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA || gBattleMons[battlerAtk].species == SPECIES_OGERPON_CORNERSTONE_MASK || gBattleMons[battlerAtk].species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA )) { - gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type2 | F_DYNAMIC_TYPE_SET; + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[1] | F_DYNAMIC_TYPE_SET; } else if (gMovesInfo[move].effect == EFFECT_NATURAL_GIFT) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a619369671..9d10c87cf7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1160,8 +1160,8 @@ bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) { if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO) && !gDisableStructs[gBattlerAttacker].usedProteanLibero - && (gBattleMons[battler].type1 != moveType || gBattleMons[battler].type2 != moveType - || (gBattleMons[battler].type3 != moveType && gBattleMons[battler].type3 != TYPE_MYSTERY)) + && (gBattleMons[battler].types[0] != moveType || gBattleMons[battler].types[1] != moveType + || (gBattleMons[battler].types[2] != moveType && gBattleMons[battler].types[2] != TYPE_MYSTERY)) && move != MOVE_STRUGGLE && GetActiveGimmick(battler) != GIMMICK_TERA) { @@ -2000,7 +2000,6 @@ static void Cmd_adjustdamage(void) } if (GetBattlerAbility(gBattlerTarget) == ABILITY_ICE_FACE && IS_MOVE_PHYSICAL(gCurrentMove) && gBattleMons[gBattlerTarget].species == SPECIES_EISCUE) { -<<<<<<< HEAD // Damage deals typeless 0 HP. gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); gBattleMoveDamage = 0; @@ -2008,312 +2007,12 @@ static void Cmd_adjustdamage(void) gBattleResources->flags->flags[gBattlerTarget] |= RESOURCE_FLAG_ICE_FACE; // Form change will be done after attack animation in Cmd_resultmessage. goto END; -======= - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBattlerTarget] = 0; - gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; - 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].types[0]) - ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] && - gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1]) - ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); - } - i += 3; - } ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc } if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; -<<<<<<< HEAD holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); param = GetBattlerHoldEffectParam(gBattlerTarget); -======= - 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[MISS_TYPE] = B_MSG_AVOIDED_DMG; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBattlerAttacker].targetNotAffected = 1; - - 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[MISS_TYPE] = B_MSG_GROUND_MISS; - 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].types[0] - && 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].types[1] && - gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] && - 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].types[0] && TYPE_EFFECT_MULTIPLIER(i) == 20) - flags |= 1; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] - && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) - flags |= 1; - - // check not very effective - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[0] && TYPE_EFFECT_MULTIPLIER(i) == 5) - flags |= 2; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] - && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] - && 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[MISS_TYPE] = B_MSG_AVOIDED_DMG; - RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD); - } - } -} - -// Same as ModulateDmgByType except different arguments -static void ModulateDmgByType2(u8 multiplier, u16 move, u8 *flags) -{ - 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].types[0]) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].types[1] && - gBattleMons[defender].types[0] != gBattleMons[defender].types[1]) - 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 = gSpeciesInfo[targetSpecies].types[0], type2 = gSpeciesInfo[targetSpecies].types[1]; - u8 moveType; - - if (move == MOVE_STRUGGLE) - return 0; - - moveType = gBattleMoves[move].type; - - if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) - { - flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; - } - else - { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == type1) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == type2 && type1 != type2) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - } - i += 3; - } - } - if (targetAbility == ABILITY_WONDER_GUARD - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[move].power) - flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - return flags; -} - -// Multiplies the damage by a random factor between 85% to 100% inclusive -static inline void ApplyRandomDmgMultiplier(void) -{ - u16 rand = Random(); - u16 randPercent = 100 - (rand % 16); - - if (gBattleMoveDamage != 0) - { - gBattleMoveDamage *= randPercent; - gBattleMoveDamage /= 100; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } -} - -static void UNUSED Unused_ApplyRandomDmgMultiplier(void) -{ - ApplyRandomDmgMultiplier(); -} - -static void Cmd_adjustnormaldamage(void) -{ - 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); - } ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc gPotentialItemEffectBattler = gBattlerTarget; @@ -5367,18 +5066,11 @@ static void Cmd_setroost(void) { CMD_ARGS(); -<<<<<<< HEAD gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_ROOST; - gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].type1; - gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].type2; + gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].types[0]; + gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].types[1]; gBattlescriptCurrInstr = cmd->nextInstr; -======= - if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[0] || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[1]) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc } static void Cmd_jumpifabilitypresent(void) @@ -6741,71 +6433,9 @@ static void Cmd_sethealblock(void) } else { -<<<<<<< HEAD gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; gDisableStructs[gBattlerTarget].healBlockTimer = 5; gBattlescriptCurrInstr = cmd->nextInstr; -======= - 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].types[0]) - { - 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].types[1]) - { - if (gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] - && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) - { - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].types[1] - && gBattleMons[gBattlerTarget].types[0] != gBattleMons[gBattlerTarget].types[1] - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) - { - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - } - } - i += 3; - } ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc } } @@ -6855,18 +6485,8 @@ static void Cmd_switchindataupdate(void) for (i = 0; i < sizeof(struct BattlePokemon); i++) monData[i] = gBattleResources->bufferB[battler][4 + i]; -<<<<<<< HEAD // Edge case: the sent out pokemon has 0 HP. This should never happen. if (!IsBattlerAlive(battler)) -======= - gBattleMons[gActiveBattler].types[0] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0]; - gBattleMons[gActiveBattler].types[1] = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1]; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); - - // check knocked off item - i = GetBattlerSide(gActiveBattler); - if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]]) ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc { // If it's a test, mark it as invalid. if (gTestRunnerEnabled) @@ -6894,9 +6514,9 @@ static void Cmd_switchindataupdate(void) } } - gBattleMons[battler].type1 = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].types[1]; - gBattleMons[battler].type3 = TYPE_MYSTERY; + gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; + gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); #if TESTING if (gTestRunnerEnabled) @@ -10532,7 +10152,7 @@ static void Cmd_various(void) } else { - gBattleMons[battler].type3 = gMovesInfo[gCurrentMove].argument; + gBattleMons[battler].types[2] = gMovesInfo[gCurrentMove].argument; PREPARE_TYPE_BUFFER(gBattleTextBuff1, gMovesInfo[gCurrentMove].argument); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12577,12 +12197,7 @@ static void Cmd_tryconversiontypechange(void) break; } } -<<<<<<< HEAD if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) -======= - if (moveType != gBattleMons[gBattlerAttacker].types[0] - && moveType != gBattleMons[gBattlerAttacker].types[1]) ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc { gBattlescriptCurrInstr = cmd->failInstr; } @@ -12615,17 +12230,13 @@ static void Cmd_tryconversiontypechange(void) else moveType = TYPE_NORMAL; } - if (moveType != gBattleMons[gBattlerAttacker].type1 - && moveType != gBattleMons[gBattlerAttacker].type2 - && moveType != gBattleMons[gBattlerAttacker].type3) + if (moveType != gBattleMons[gBattlerAttacker].types[0] + && moveType != gBattleMons[gBattlerAttacker].types[1] + && moveType != gBattleMons[gBattlerAttacker].types[2]) { break; } } -<<<<<<< HEAD -======= - while (moveType == gBattleMons[gBattlerAttacker].types[0] || moveType == gBattleMons[gBattlerAttacker].types[1]); ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc if (moveChecked == validMoves) { @@ -12647,7 +12258,7 @@ static void Cmd_tryconversiontypechange(void) moveType = TYPE_NORMAL; } } - while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2 || moveType == gBattleMons[gBattlerAttacker].type3); + while (moveType == gBattleMons[gBattlerAttacker].types[0] || moveType == gBattleMons[gBattlerAttacker].types[1] || moveType == gBattleMons[gBattlerAttacker].types[2]); SET_BATTLER_TYPE(gBattlerAttacker, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); @@ -12815,57 +12426,6 @@ static void Cmd_unused_95(void) static void Cmd_unused_96(void) { -<<<<<<< HEAD -======= - if (WEATHER_HAS_EFFECT) - { - if (gBattleWeather & B_WEATHER_SANDSTORM) - { - if (gBattleMons[gBattlerAttacker].types[0] != TYPE_ROCK - && gBattleMons[gBattlerAttacker].types[0] != TYPE_STEEL - && gBattleMons[gBattlerAttacker].types[0] != TYPE_GROUND - && gBattleMons[gBattlerAttacker].types[1] != TYPE_ROCK - && gBattleMons[gBattlerAttacker].types[1] != TYPE_STEEL - && gBattleMons[gBattlerAttacker].types[1] != TYPE_GROUND - && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - if (gBattleWeather & B_WEATHER_HAIL) - { - if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) - { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else - { - gBattleMoveDamage = 0; - } - } - } - else - { - gBattleMoveDamage = 0; - } - - if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) - gBattleMoveDamage = 0; - - gBattlescriptCurrInstr++; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc } static void Cmd_tryinfatuating(void) @@ -16963,30 +16523,30 @@ void BS_TryReflectType(void) } else if (targetType1 == TYPE_MYSTERY && targetType2 == TYPE_MYSTERY && targetType3 != TYPE_MYSTERY) { - gBattleMons[gBattlerAttacker].type1 = TYPE_NORMAL; - gBattleMons[gBattlerAttacker].type2 = TYPE_NORMAL; - gBattleMons[gBattlerAttacker].type3 = targetType3; + gBattleMons[gBattlerAttacker].types[0] = TYPE_NORMAL; + gBattleMons[gBattlerAttacker].types[1] = TYPE_NORMAL; + gBattleMons[gBattlerAttacker].types[2] = targetType3; gBattlescriptCurrInstr = cmd->nextInstr; } else if (targetType1 == TYPE_MYSTERY && targetType2 != TYPE_MYSTERY) { - gBattleMons[gBattlerAttacker].type1 = targetType2; - gBattleMons[gBattlerAttacker].type2 = targetType2; - gBattleMons[gBattlerAttacker].type3 = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetType2; + gBattleMons[gBattlerAttacker].types[1] = targetType2; + gBattleMons[gBattlerAttacker].types[2] = targetType3; gBattlescriptCurrInstr = cmd->nextInstr; } else if (targetType1 != TYPE_MYSTERY && targetType2 == TYPE_MYSTERY) { - gBattleMons[gBattlerAttacker].type1 = targetType1; - gBattleMons[gBattlerAttacker].type2 = targetType1; - gBattleMons[gBattlerAttacker].type3 = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetType1; + gBattleMons[gBattlerAttacker].types[1] = targetType1; + gBattleMons[gBattlerAttacker].types[2] = targetType3; gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattleMons[gBattlerAttacker].type1 = targetType1; - gBattleMons[gBattlerAttacker].type2 = targetType2; - gBattleMons[gBattlerAttacker].type3 = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetType1; + gBattleMons[gBattlerAttacker].types[1] = targetType2; + gBattleMons[gBattlerAttacker].types[2] = targetType3; gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/src/battle_util.c b/src/battle_util.c index 5520314280..821f785810 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10598,8 +10598,8 @@ s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 ma s32 GetStealthHazardDamage(u8 hazardType, u32 battler) { - u8 type1 = gBattleMons[battler].type1; - u8 type2 = gBattleMons[battler].type2; + u8 type1 = gBattleMons[battler].types[0]; + u8 type2 = gBattleMons[battler].types[1]; u32 maxHp = gBattleMons[battler].maxHP; return GetStealthHazardDamageByTypesAndHP(hazardType, type1, type2, maxHp); @@ -11496,9 +11496,9 @@ void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon) void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon) { gBattleMons[battler].ability = GetMonAbility(mon); - gBattleMons[battler].type1 = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].type2 = gSpeciesInfo[gBattleMons[battler].species].types[1]; - gBattleMons[battler].type3 = TYPE_MYSTERY; + gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; + gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[2] = TYPE_MYSTERY; } void RecalcBattlerStats(u32 battler, struct Pokemon *mon) @@ -11703,9 +11703,9 @@ u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera) { u32 teraType = GetBattlerTeraType(battler); u16 types[3] = {0}; - types[0] = gBattleMons[battler].type1; - types[1] = gBattleMons[battler].type2; - types[2] = gBattleMons[battler].type3; + types[0] = gBattleMons[battler].types[0]; + types[1] = gBattleMons[battler].types[1]; + types[2] = gBattleMons[battler].types[2]; // Handle Terastallization if (GetActiveGimmick(battler) == GIMMICK_TERA && teraType != TYPE_STELLAR && !ignoreTera) @@ -11734,8 +11734,8 @@ void RemoveBattlerType(u32 battler, u8 type) return; for (i = 0; i < 3; i++) { - if (*(u8 *)(&gBattleMons[battler].type1 + i) == type) - *(u8 *)(&gBattleMons[battler].type1 + i) = TYPE_MYSTERY; + if (*(u8 *)(&gBattleMons[battler].types[0] + i) == type) + *(u8 *)(&gBattleMons[battler].types[0] + i) = TYPE_MYSTERY; } } diff --git a/src/battle_z_move.c b/src/battle_z_move.c index c000c35808..89514336a7 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -284,7 +284,7 @@ bool32 MoveSelectionDisplayZMove(u16 zmove, u32 battler) if (zEffect == Z_EFFECT_CURSE) { - if (moveInfo->monType1 == TYPE_GHOST || moveInfo->monType2 == TYPE_GHOST || moveInfo->monType3 == TYPE_GHOST) + if (moveInfo->monTypes[0] == TYPE_GHOST || moveInfo->monTypes[1] == TYPE_GHOST || moveInfo->monTypes[2] == TYPE_GHOST) zEffect = Z_EFFECT_RECOVER_HP; else zEffect = Z_EFFECT_ATK_UP_1; diff --git a/src/pokemon.c b/src/pokemon.c index c354a7fe47..66fb83332f 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3659,7 +3659,6 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) dst->pp[i] = GetMonData(src, MON_DATA_PP1 + i, NULL); } -<<<<<<< HEAD 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); @@ -3683,47 +3682,14 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL); dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL); dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); - dst->type1 = gSpeciesInfo[dst->species].types[0]; - dst->type2 = gSpeciesInfo[dst->species].types[1]; - dst->type3 = TYPE_MYSTERY; + dst->types[0] = gSpeciesInfo[dst->species].types[0]; + dst->types[1] = gSpeciesInfo[dst->species].types[1]; + dst->types[2] = TYPE_MYSTERY; dst->isShiny = IsMonShiny(src); dst->ability = GetAbilityBySpecies(dst->species, dst->abilityNum); GetMonData(src, MON_DATA_NICKNAME, nickname); StringCopy_Nickname(dst->nickname, nickname); GetMonData(src, MON_DATA_OT_NAME, dst->otName); -======= - gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); - gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); - gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); - gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); - gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); - gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); - gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); - gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); - gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); - gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); - gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); - gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); - gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); - gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); - gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); - gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); - gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); - gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); - gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL); - gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); - gBattleMons[battlerId].types[0] = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; - gBattleMons[battlerId].types[1] = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; - gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName); - - hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)]; - *hpSwitchout = gBattleMons[battlerId].hp; ->>>>>>> 312749dd3109e607779bb1a15f3669ea2b0979dc for (i = 0; i < NUM_BATTLE_STATS; i++) dst->statStages[i] = DEFAULT_STAT_STAGE; diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index b75ffc0b0d..32ed9520c8 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -123,9 +123,9 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT_TYPE, player); MESSAGE("Arcanine's type changed to match the Foe Poliwrath's!"); } THEN { - EXPECT_EQ(player->type1, TYPE_WATER); - EXPECT_EQ(player->type2, TYPE_FIGHTING); - EXPECT_EQ(player->type3, TYPE_MYSTERY); + EXPECT_EQ(player->types[0], TYPE_WATER); + EXPECT_EQ(player->types[1], TYPE_FIGHTING); + EXPECT_EQ(player->types[2], TYPE_MYSTERY); } } @@ -145,13 +145,13 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT_TYPE, player); MESSAGE("Arcanine's type changed to match the Foe Sudowoodo's!"); } THEN { - EXPECT_EQ(player->type1, TYPE_ROCK); - EXPECT_EQ(player->type2, TYPE_ROCK); - EXPECT_EQ(player->type3, TYPE_MYSTERY); + EXPECT_EQ(player->types[0], TYPE_ROCK); + EXPECT_EQ(player->types[1], TYPE_ROCK); + EXPECT_EQ(player->types[2], TYPE_MYSTERY); } } -SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's type1 and type2 if the target only has a 3rd type") +SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's types[0] and types[1] if the target only has a 3rd type") { ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); @@ -179,8 +179,8 @@ SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's type1 an ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT_TYPE, player); MESSAGE("Wobbuffet's type changed to match the Foe Arcanine's!"); } THEN { - EXPECT_EQ(player->type1, TYPE_NORMAL); - EXPECT_EQ(player->type2, TYPE_NORMAL); - EXPECT_EQ(player->type3, TYPE_GRASS); + EXPECT_EQ(player->types[0], TYPE_NORMAL); + EXPECT_EQ(player->types[1], TYPE_NORMAL); + EXPECT_EQ(player->types[2], TYPE_GRASS); } } diff --git a/test/battle/terrain/electric.c b/test/battle/terrain/electric.c index 2227afdcd9..c39bfbbb71 100644 --- a/test/battle/terrain/electric.c +++ b/test/battle/terrain/electric.c @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Electric Terrain activates Electric Seed and Mimicry") ABILITY_POPUP(opponent); MESSAGE("Foe Stunfisk's type changed to Electric!"); } THEN { - EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].type1, TYPE_ELECTRIC); + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_ELECTRIC); } } diff --git a/test/battle/terrain/grassy.c b/test/battle/terrain/grassy.c index 862c9052fd..5840f0310c 100644 --- a/test/battle/terrain/grassy.c +++ b/test/battle/terrain/grassy.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain activates Grassy Seed and Mimicry") ABILITY_POPUP(opponent); MESSAGE("Foe Stunfisk's type changed to Grass!"); } THEN { - EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].type1, TYPE_GRASS); + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_GRASS); } } diff --git a/test/battle/terrain/misty.c b/test/battle/terrain/misty.c index cd89b2d9ab..fbf04fcba9 100644 --- a/test/battle/terrain/misty.c +++ b/test/battle/terrain/misty.c @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Misty Terrain activates Misty Seed and Mimicry") ABILITY_POPUP(opponent); MESSAGE("Foe Stunfisk's type changed to Fairy!"); } THEN { - EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].type1, TYPE_FAIRY); + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_FAIRY); } } diff --git a/test/battle/terrain/psychic.c b/test/battle/terrain/psychic.c index 0c13122fa6..44a89598d2 100644 --- a/test/battle/terrain/psychic.c +++ b/test/battle/terrain/psychic.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain activates Psychic Seed and Mimicry") ABILITY_POPUP(opponent); MESSAGE("Foe Stunfisk's type changed to Psychic!"); } THEN { - EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].type1, TYPE_PSYCHIC); + EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_PSYCHIC); } } From 5fbe5a331c0f8ccc0dcce631f6fe8bc6ce94dc76 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Wed, 7 Aug 2024 13:33:35 -0700 Subject: [PATCH 055/225] Updated spacing per https://github.com/rh-hideout/pokeemerald-expansion/pull/5114\#discussion_r1707607637 --- include/battle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/battle.h b/include/battle.h index 090ae5c347..a1007385b7 100644 --- a/include/battle.h +++ b/include/battle.h @@ -839,8 +839,8 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER gBattleMons[battlerId].types[2] = TYPE_MYSTERY; \ } -#define RESTORE_BATTLER_TYPE(battlerId) \ -{ \ +#define RESTORE_BATTLER_TYPE(battlerId) \ +{ \ gBattleMons[battlerId].types[0] = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; \ gBattleMons[battlerId].types[1] = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; \ gBattleMons[battlerId].types[2] = TYPE_MYSTERY; \ From b8dab587abddb6b635fbf89153016fdcf4b33600 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:32:36 -0700 Subject: [PATCH 056/225] Update include/battle.h Co-authored-by: Bassoonian --- include/battle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/battle.h b/include/battle.h index a1007385b7..fdc9575b24 100644 --- a/include/battle.h +++ b/include/battle.h @@ -832,8 +832,8 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define IS_BATTLER_OF_BASE_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, TRUE) == type || GetBattlerType(battlerId, 1, TRUE) == type || (GetBattlerType(battlerId, 2, TRUE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, TRUE) == type))) #define IS_BATTLER_TYPELESS(battlerId)(GetBattlerType(battlerId, 0, FALSE) == TYPE_MYSTERY && GetBattlerType(battlerId, 1, FALSE) == TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == TYPE_MYSTERY) -#define SET_BATTLER_TYPE(battlerId, type) \ -{ \ +#define SET_BATTLER_TYPE(battlerId, type) \ +{ \ gBattleMons[battlerId].types[0] = type; \ gBattleMons[battlerId].types[1] = type; \ gBattleMons[battlerId].types[2] = TYPE_MYSTERY; \ From 6bbc0601a9f38fde828dabd6199d92349a827851 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 8 Aug 2024 10:39:38 +0200 Subject: [PATCH 057/225] Fixed non-grass Ivy Cudgel breaking battle UI (#5117) Co-authored-by: Hedara --- src/data/battle_anim.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 371fb61a48..ec98ecd854 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1455,9 +1455,9 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_SyrupSplat, 0x400, ANIM_TAG_SYRUP_SPLAT_RED}, {gBattleAnimSpriteGfx_SyrupSplat, 0x400, ANIM_TAG_SYRUP_SPLAT_YELLOW}, {gBattleAnimSpriteGfx_IvyCudgel, 0x800, ANIM_TAG_IVY_CUDGEL_GRASS}, - {NULL, 0x0, ANIM_TAG_IVY_CUDGEL_FIRE}, - {NULL, 0x0, ANIM_TAG_IVY_CUDGEL_ROCK}, - {NULL, 0x0, ANIM_TAG_IVY_CUDGEL_WATER}, + {gBattleAnimSpriteGfx_IvyCudgel, 0x800, ANIM_TAG_IVY_CUDGEL_FIRE}, + {gBattleAnimSpriteGfx_IvyCudgel, 0x800, ANIM_TAG_IVY_CUDGEL_ROCK}, + {gBattleAnimSpriteGfx_IvyCudgel, 0x800, ANIM_TAG_IVY_CUDGEL_WATER}, {gBattleAnimSpriteGfx_TeraCrystal, 0x800, ANIM_TAG_TERA_CRYSTAL}, {gBattleAnimSpriteGfx_TeraShatter, 0x0180, ANIM_TAG_TERA_SHATTER}, {gBattleAnimSpriteGfx_DreepyMissile, 0x200, ANIM_TAG_DREEPY_SHINY}, From 355739db6310da76056074edb3ce8e684163ec14 Mon Sep 17 00:00:00 2001 From: Galaxeeh <154106034+Galaxeeh@users.noreply.github.com> Date: Thu, 8 Aug 2024 04:08:50 -0500 Subject: [PATCH 058/225] Dynamic Move Types in Summary Screen/Battle (#5084) * Dynamic Hidden Power Types * Dynamic Ivy Cudgel is summary screens * Dynamic Move types * missed unnecessary comment that got left in * format cleanup, return cleanup, added Tera Blast and Tera Starstorm, Revelation dance fix-> now displays live type update when tera is selected during battle before move selection * forgot to revert config defaults * Update src/pokemon.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * if block spaces/ raging bull fix/ more condensing on checks/ reallocating config check/ tera blast fix (was displaying tera blast type on non tera'd mons in party when battler was tera'd) * revert configs * added Hail check to Weather Ball * Fixed agbcc compile/brackets/u32 changes * Quick fix to ensure Judgment/Techno Blast/Natural Gift are not affected by -ate abilities * Update src/pokemon_summary_screen.c --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_ai_switch_items.h | 1 + include/config/pokemon.h | 1 + include/pokemon.h | 2 + src/battle_ai_switch_items.c | 2 +- src/battle_controller_player.c | 17 +++- src/pokemon.c | 147 +++++++++++++++++++++++++++++++ src/pokemon_summary_screen.c | 29 +++++- 7 files changed, 192 insertions(+), 7 deletions(-) diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index b52e792612..3c70132afe 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -5,5 +5,6 @@ void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd); bool32 ShouldSwitch(u32 battler, bool32 emitResult); +bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 7bf9450cbb..89e72cec17 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -51,6 +51,7 @@ #define P_TWO_FRAME_FRONT_SPRITES TRUE // In Pokémon Emerald, Pokémon front sprites always consist of two frames. This config can revert it to only use the first frame, as is the case in the other Gen 3 games. #define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, Pokémon encountered in the Battle Pyramid won't be shiny. #define P_NO_SHINIES_WITHOUT_POKEBALLS FALSE // If TRUE, Pokémon encountered when the player is out of Poké Balls won't be shiny +#define P_SHOW_DYNAMIC_TYPES FALSE // If TRUE, moves with dynamic type changes will be reflected as their current type in battle/summary screens. // Learnset helper toggles #define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors. diff --git a/include/pokemon.h b/include/pokemon.h index a67241fb14..4be40addbf 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -882,5 +882,7 @@ const u8 *GetMoveName(u16 moveId); const u8 *GetMoveAnimationScript(u16 moveId); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); +u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); +u8 CalculateHiddenPowerType(struct Pokemon *mon); #endif // GUARD_POKEMON_H diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a0a44cb98d..d85cf28d37 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1318,7 +1318,7 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva return bestMonId; } -static bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) +bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) { // List that makes mon not grounded if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 6dcea9eb98..f49a8f95c7 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1716,15 +1716,14 @@ static void MoveSelectionDisplayMoveType(u32 battler) u8 type; u32 speciesId; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); - txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); - type = gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].type; if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_TERA_BLAST) { if (IsGimmickSelected(battler, GIMMICK_TERA) || GetActiveGimmick(battler) == GIMMICK_TERA) type = GetBattlerTeraType(battler); + end = StringCopy(txtPtr, gTypesInfo[type].name); } else if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_IVY_CUDGEL) { @@ -1734,21 +1733,33 @@ static void MoveSelectionDisplayMoveType(u32 battler) || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK || speciesId == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK || speciesId == SPECIES_OGERPON_CORNERSTONE_MASK_TERA) type = gBattleMons[battler].type2; + end = StringCopy(txtPtr, gTypesInfo[type].name); } // Max Guard is a Normal-type move else if (gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].category == DAMAGE_CATEGORY_STATUS && (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX))) { type = TYPE_NORMAL; + end = StringCopy(txtPtr, gTypesInfo[type].name); } else if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_TERA_STARSTORM) { if (gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR || (IsGimmickSelected(battler, GIMMICK_TERA) && gBattleMons[battler].species == SPECIES_TERAPAGOS_TERASTAL)) type = TYPE_STELLAR; + end = StringCopy(txtPtr, gTypesInfo[type].name); + } + else if (P_SHOW_DYNAMIC_TYPES) + { + struct Pokemon *mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; + type = CheckDynamicMoveType(mon, moveInfo->moves[gMoveSelectionCursor[battler]], battler); + end = StringCopy(txtPtr, gTypesInfo[type].name); + } + else + { + end = StringCopy(txtPtr, gTypesInfo[type].name); } - end = StringCopy(txtPtr, gTypesInfo[type].name); PrependFontIdToFit(txtPtr, end, FONT_NORMAL, WindowWidthPx(B_WIN_MOVE_TYPE) - 25); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_TYPE); } diff --git a/src/pokemon.c b/src/pokemon.c index c8d52ddb9d..1807b675df 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2,6 +2,7 @@ #include "malloc.h" #include "apprentice.h" #include "battle.h" +#include "battle_ai_switch_items.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_message.h" @@ -6941,3 +6942,149 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } } + +u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) +{ + u32 type = gMovesInfo[move].type; + u32 species = GetMonData(mon, MON_DATA_SPECIES); + u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u32 heldItemEffect = ItemId_GetHoldEffect(heldItem); + u32 ability = GetMonAbility(mon); + u32 type1 = gSpeciesInfo[species].types[0]; + u32 type2 = gSpeciesInfo[species].types[1]; + + if (move == MOVE_IVY_CUDGEL + && (species == SPECIES_OGERPON_WELLSPRING_MASK || species == SPECIES_OGERPON_WELLSPRING_MASK_TERA + || species == SPECIES_OGERPON_HEARTHFLAME_MASK || species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA + || species == SPECIES_OGERPON_CORNERSTONE_MASK || species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA)) + { + type = type2; + } + else if (move == MOVE_STRUGGLE) + { + return TYPE_NORMAL; + } + else if (move == MOVE_TERA_BLAST && GetActiveGimmick(battler) == GIMMICK_TERA && gBattleMons[battler].species == species) + { + return GetMonData(mon, MON_DATA_TERA_TYPE); + } + else if (move == MOVE_TERA_STARSTORM && species == SPECIES_TERAPAGOS_STELLAR) + { + return TYPE_STELLAR; + } + else if (move == MOVE_HIDDEN_POWER) + { + return CalculateHiddenPowerType(mon); + } + else if (move == MOVE_AURA_WHEEL && species == SPECIES_MORPEKO_HANGRY) + { + type = TYPE_DARK; + } + else if (gMovesInfo[move].effect == EFFECT_CHANGE_TYPE_ON_ITEM) + { + if (heldItemEffect == gMovesInfo[move].argument) + return ItemId_GetSecondaryId(heldItem); + else + return TYPE_NORMAL; + } + else if (move == MOVE_NATURAL_GIFT) + { + if (ItemId_GetPocket(heldItem) == POCKET_BERRIES) + return gNaturalGiftTable[ITEM_TO_BERRY(heldItem)].type; + else + return TYPE_NORMAL; + } + else if (move == MOVE_RAGING_BULL + && (species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED + || species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED + || species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) + { + return type2; + } + else if (move == MOVE_REVELATION_DANCE) + { + if (gBattleMons[battler].species != species && type1 != TYPE_MYSTERY) + type = type1; + else if (gBattleMons[battler].species != species && type2 != TYPE_MYSTERY) + type = type2; + else if (GetBattlerTeraType(battler) != TYPE_STELLAR && (GetActiveGimmick(battler) == GIMMICK_TERA || IsGimmickSelected(battler, GIMMICK_TERA))) + type = GetMonData(mon, MON_DATA_TERA_TYPE); + else if (gBattleMons[battler].type1 != TYPE_MYSTERY) + type = gBattleMons[battler].type1; + else if (gBattleMons[battler].type2 != TYPE_MYSTERY) + type = gBattleMons[battler].type2; + else if (gBattleMons[battler].type3 != TYPE_MYSTERY) + type = gBattleMons[battler].type3; + } + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE + && ((IsMonGrounded(heldItemEffect, ability, type1, type2) && gBattleMons[battler].species != species) + || (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY) && gBattleMons[battler].species == species))) + { + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + return TYPE_ELECTRIC; + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + return TYPE_GRASS; + else if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + return TYPE_FAIRY; + else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + return TYPE_PSYCHIC; + else //failsafe + type = TYPE_NORMAL; + } + + if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && WEATHER_HAS_EFFECT) + { + if (gBattleWeather & B_WEATHER_RAIN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_WATER; + else if (gBattleWeather & B_WEATHER_SANDSTORM) + return TYPE_ROCK; + else if (gBattleWeather & B_WEATHER_SUN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_FIRE; + else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) + return TYPE_ICE; + else + return TYPE_NORMAL; + } + + if (ability == ABILITY_NORMALIZE && gMovesInfo[move].type != TYPE_NORMAL && GetActiveGimmick(battler) != GIMMICK_Z_MOVE) + type = TYPE_NORMAL; + + if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && type == TYPE_NORMAL) || gStatuses4[battler] & STATUS4_ELECTRIFIED) + type = TYPE_ELECTRIC; + + if (gMovesInfo[move].type == TYPE_NORMAL && gMovesInfo[move].category != DAMAGE_CATEGORY_STATUS) + { + switch (ability) + { + case ABILITY_PIXILATE: return TYPE_FAIRY; + case ABILITY_REFRIGERATE: return TYPE_ICE; + case ABILITY_AERILATE: return TYPE_FLYING; + case ABILITY_GALVANIZE: return TYPE_ELECTRIC; + default: break; + } + } + + if (ability == ABILITY_LIQUID_VOICE && gMovesInfo[move].soundMove == TRUE) + return TYPE_WATER; + + return type; +} + +u8 CalculateHiddenPowerType(struct Pokemon *mon) +{ + u32 typehp; + u32 type; + u8 typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) + | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) + | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) + | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) + | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) + | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); + + type = (15 * typeBits) / 63 + 2; + if (type >= TYPE_MYSTERY) + type++; + type |= 0xC0; + typehp = type & 0x3F; + return typehp; +} diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index e81ef0b066..a1ebc2b188 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3957,16 +3957,29 @@ static void SetMonTypeIcons(void) static void SetMoveTypeIcons(void) { - u8 i; + u32 i; + u32 type; struct PokeSummary *summary = &sMonSummaryScreen->summary; + struct Pokemon *mon = &sMonSummaryScreen->currentMon; + for (i = 0; i < MAX_MON_MOVES; i++) { if (summary->moves[i] != MOVE_NONE) { - SetTypeSpritePosAndPal(gMovesInfo[summary->moves[i]].type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + if (P_SHOW_DYNAMIC_TYPES) + { + type = CheckDynamicMoveType(mon, summary->moves[i], 0); + SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + } + else + { + SetTypeSpritePosAndPal(gMovesInfo[summary->moves[i]].type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + } } else + { SetSpriteInvisibility(i + SPRITE_ARR_ID_TYPE, TRUE); + } } } @@ -3985,6 +3998,12 @@ static void SetContestMoveTypeIcons(void) static void SetNewMoveTypeIcon(void) { + u32 type = gMovesInfo[sMonSummaryScreen->newMove].type; + struct Pokemon *mon = &sMonSummaryScreen->currentMon; + + if (P_SHOW_DYNAMIC_TYPES) + type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0); + if (sMonSummaryScreen->newMove == MOVE_NONE) { SetSpriteInvisibility(SPRITE_ARR_ID_TYPE + 4, TRUE); @@ -3992,9 +4011,13 @@ static void SetNewMoveTypeIcon(void) else { if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES) - SetTypeSpritePosAndPal(gMovesInfo[sMonSummaryScreen->newMove].type, 85, 96, SPRITE_ARR_ID_TYPE + 4); + { + SetTypeSpritePosAndPal(type, 85, 96, SPRITE_ARR_ID_TYPE + 4); + } else + { SetTypeSpritePosAndPal(NUMBER_OF_MON_TYPES + gMovesInfo[sMonSummaryScreen->newMove].contestCategory, 85, 96, SPRITE_ARR_ID_TYPE + 4); + } } } From 754beeee5d29544b64c0eb48e7467d4ebbdfb7dd Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Thu, 8 Aug 2024 08:46:17 -0400 Subject: [PATCH 059/225] Created COMPOUND_STRINGs for default player names (#5037) * Converted default names to COMPOUND_STRINGs * Moved new game strings out to main_menu --- include/strings.h | 59 -------------------------- src/main_menu.c | 104 +++++++++++++++++++++++++++------------------- src/strings.c | 61 --------------------------- 3 files changed, 62 insertions(+), 162 deletions(-) diff --git a/include/strings.h b/include/strings.h index ec175ab251..7ad99aad56 100644 --- a/include/strings.h +++ b/include/strings.h @@ -324,19 +324,6 @@ extern const u8 gText_SelectorArrow3[]; extern const u8 gText_YesNo[]; // main menu/birch speech text -extern const u8 gText_SaveFileErased[]; -extern const u8 gText_SaveFileCorrupted[]; -extern const u8 gJPText_No1MSubCircuit[]; -extern const u8 gText_BatteryRunDry[]; -extern const u8 gText_MainMenuNewGame[]; -extern const u8 gText_MainMenuOption[]; -extern const u8 gText_MainMenuContinue[]; -extern const u8 gText_MainMenuMysteryGift2[]; -extern const u8 gText_MainMenuMysteryEvents[]; -extern const u8 gText_MainMenuMysteryGift[]; -extern const u8 gText_WirelessNotConnected[]; -extern const u8 gText_MysteryGiftCantUse[]; -extern const u8 gText_MysteryEventsCantUse[]; extern const u8 gText_Birch_Welcome[]; extern const u8 gText_ThisIsAPokemon[]; extern const u8 gText_Birch_MainSpeech[]; @@ -346,52 +333,6 @@ extern const u8 gText_Birch_WhatsYourName[]; extern const u8 gText_Birch_SoItsPlayer[]; extern const u8 gText_Birch_YourePlayer[]; extern const u8 gText_Birch_AreYouReady[]; -extern const u8 gText_ContinueMenuPlayer[]; -extern const u8 gText_ContinueMenuTime[]; -extern const u8 gText_ContinueMenuPokedex[]; -extern const u8 gText_ContinueMenuBadges[]; -extern const u8 gText_BirchBoy[]; -extern const u8 gText_BirchGirl[]; -extern const u8 gText_DefaultNameStu[]; -extern const u8 gText_DefaultNameMilton[]; -extern const u8 gText_DefaultNameTom[]; -extern const u8 gText_DefaultNameKenny[]; -extern const u8 gText_DefaultNameReid[]; -extern const u8 gText_DefaultNameJude[]; -extern const u8 gText_DefaultNameJaxson[]; -extern const u8 gText_DefaultNameEaston[]; -extern const u8 gText_DefaultNameWalker[]; -extern const u8 gText_DefaultNameTeru[]; -extern const u8 gText_DefaultNameJohnny[]; -extern const u8 gText_DefaultNameBrett[]; -extern const u8 gText_DefaultNameSeth[]; -extern const u8 gText_DefaultNameTerry[]; -extern const u8 gText_DefaultNameCasey[]; -extern const u8 gText_DefaultNameDarren[]; -extern const u8 gText_DefaultNameLandon[]; -extern const u8 gText_DefaultNameCollin[]; -extern const u8 gText_DefaultNameStanley[]; -extern const u8 gText_DefaultNameQuincy[]; -extern const u8 gText_DefaultNameKimmy[]; -extern const u8 gText_DefaultNameTiara[]; -extern const u8 gText_DefaultNameBella[]; -extern const u8 gText_DefaultNameJayla[]; -extern const u8 gText_DefaultNameAllie[]; -extern const u8 gText_DefaultNameLianna[]; -extern const u8 gText_DefaultNameSara[]; -extern const u8 gText_DefaultNameMonica[]; -extern const u8 gText_DefaultNameCamila[]; -extern const u8 gText_DefaultNameAubree[]; -extern const u8 gText_DefaultNameRuthie[]; -extern const u8 gText_DefaultNameHazel[]; -extern const u8 gText_DefaultNameNadine[]; -extern const u8 gText_DefaultNameTanja[]; -extern const u8 gText_DefaultNameYasmin[]; -extern const u8 gText_DefaultNameNicola[]; -extern const u8 gText_DefaultNameLillie[]; -extern const u8 gText_DefaultNameTerra[]; -extern const u8 gText_DefaultNameLucy[]; -extern const u8 gText_DefaultNameHalie[]; extern const u8 gText_BirchInTrouble[]; extern const u8 gText_ConfirmStarterChoice[]; diff --git a/src/main_menu.c b/src/main_menu.c index c1f092b2ca..504fbfb186 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -257,6 +257,26 @@ static const u32 sBirchSpeechBgMap[] = INCBIN_U32("graphics/birch_speech/map.bin static const u16 sBirchSpeechBgGradientPal[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); static const u16 sBirchSpeechPlatformBlackPal[] = {RGB_BLACK, RGB_BLACK, RGB_BLACK, RGB_BLACK, RGB_BLACK, RGB_BLACK, RGB_BLACK, RGB_BLACK}; +static const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded."); +static const u8 gText_SaveFileErased[] = _("The save file has been erased\ndue to corruption or damage."); +static const u8 gJPText_No1MSubCircuit[] = _("1Mサブきばんが ささっていません!"); +static const u8 gText_BatteryRunDry[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur."); + +static const u8 gText_MainMenuNewGame[] = _("NEW GAME"); +static const u8 gText_MainMenuContinue[] = _("CONTINUE"); +static const u8 gText_MainMenuOption[] = _("OPTION"); +static const u8 gText_MainMenuMysteryGift[] = _("MYSTERY GIFT"); +static const u8 gText_MainMenuMysteryGift2[] = _("MYSTERY GIFT"); +static const u8 gText_MainMenuMysteryEvents[] = _("MYSTERY EVENTS"); +static const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected."); +static const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can't be used while\nthe Wireless Adapter is attached."); +static const u8 gText_MysteryEventsCantUse[] = _("MYSTERY EVENTS can't be used while\nthe Wireless Adapter is attached."); + +static const u8 gText_ContinueMenuPlayer[] = _("PLAYER"); +static const u8 gText_ContinueMenuTime[] = _("TIME"); +static const u8 gText_ContinueMenuPokedex[] = _("POKéDEX"); +static const u8 gText_ContinueMenuBadges[] = _("BADGES"); + #define MENU_LEFT 2 #define MENU_TOP_WIN0 1 #define MENU_TOP_WIN1 5 @@ -454,54 +474,54 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_PlayerShrink[] = }; static const struct MenuAction sMenuActions_Gender[] = { - {gText_BirchBoy, {NULL}}, - {gText_BirchGirl, {NULL}} + {COMPOUND_STRING("BOY"), {NULL}}, + {COMPOUND_STRING("GIRL"), {NULL}} }; static const u8 *const sMalePresetNames[] = { - gText_DefaultNameStu, - gText_DefaultNameMilton, - gText_DefaultNameTom, - gText_DefaultNameKenny, - gText_DefaultNameReid, - gText_DefaultNameJude, - gText_DefaultNameJaxson, - gText_DefaultNameEaston, - gText_DefaultNameWalker, - gText_DefaultNameTeru, - gText_DefaultNameJohnny, - gText_DefaultNameBrett, - gText_DefaultNameSeth, - gText_DefaultNameTerry, - gText_DefaultNameCasey, - gText_DefaultNameDarren, - gText_DefaultNameLandon, - gText_DefaultNameCollin, - gText_DefaultNameStanley, - gText_DefaultNameQuincy + COMPOUND_STRING("STU"), + COMPOUND_STRING("MILTON"), + COMPOUND_STRING("TOM"), + COMPOUND_STRING("KENNY"), + COMPOUND_STRING("REID"), + COMPOUND_STRING("JUDE"), + COMPOUND_STRING("JAXSON"), + COMPOUND_STRING("EASTON"), + COMPOUND_STRING("WALKER"), + COMPOUND_STRING("TERU"), + COMPOUND_STRING("JOHNNY"), + COMPOUND_STRING("BRETT"), + COMPOUND_STRING("SETH"), + COMPOUND_STRING("TERRY"), + COMPOUND_STRING("CASEY"), + COMPOUND_STRING("DARREN"), + COMPOUND_STRING("LANDON"), + COMPOUND_STRING("COLLIN"), + COMPOUND_STRING("STANLEY"), + COMPOUND_STRING("QUINCY") }; static const u8 *const sFemalePresetNames[] = { - gText_DefaultNameKimmy, - gText_DefaultNameTiara, - gText_DefaultNameBella, - gText_DefaultNameJayla, - gText_DefaultNameAllie, - gText_DefaultNameLianna, - gText_DefaultNameSara, - gText_DefaultNameMonica, - gText_DefaultNameCamila, - gText_DefaultNameAubree, - gText_DefaultNameRuthie, - gText_DefaultNameHazel, - gText_DefaultNameNadine, - gText_DefaultNameTanja, - gText_DefaultNameYasmin, - gText_DefaultNameNicola, - gText_DefaultNameLillie, - gText_DefaultNameTerra, - gText_DefaultNameLucy, - gText_DefaultNameHalie + COMPOUND_STRING("KIMMY"), + COMPOUND_STRING("TIARA"), + COMPOUND_STRING("BELLA"), + COMPOUND_STRING("JAYLA"), + COMPOUND_STRING("ALLIE"), + COMPOUND_STRING("LIANNA"), + COMPOUND_STRING("SARA"), + COMPOUND_STRING("MONICA"), + COMPOUND_STRING("CAMILA"), + COMPOUND_STRING("AUBREE"), + COMPOUND_STRING("RUTHIE"), + COMPOUND_STRING("HAZEL"), + COMPOUND_STRING("NADINE"), + COMPOUND_STRING("TANJA"), + COMPOUND_STRING("YASMIN"), + COMPOUND_STRING("NICOLA"), + COMPOUND_STRING("LILLIE"), + COMPOUND_STRING("TERRA"), + COMPOUND_STRING("LUCY"), + COMPOUND_STRING("HALIE") }; // The number of male vs. female names is assumed to be the same. diff --git a/src/strings.c b/src/strings.c index 28ed992d43..a5533731ed 100644 --- a/src/strings.c +++ b/src/strings.c @@ -21,21 +21,6 @@ const u8 gText_ExpandedPlaceholder_May[] = _("MAY"); const u8 gText_EggNickname[] = _("EGG"); const u8 gText_Pokemon[] = _("POKéMON"); const u8 gText_ProfBirchMatchCallName[] = _("PROF. BIRCH"); -const u8 gText_MainMenuNewGame[] = _("NEW GAME"); -const u8 gText_MainMenuContinue[] = _("CONTINUE"); -const u8 gText_MainMenuOption[] = _("OPTION"); -const u8 gText_MainMenuMysteryGift[] = _("MYSTERY GIFT"); -const u8 gText_MainMenuMysteryGift2[] = _("MYSTERY GIFT"); -const u8 gText_MainMenuMysteryEvents[] = _("MYSTERY EVENTS"); -const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected."); -const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can't be used while\nthe Wireless Adapter is attached."); -const u8 gText_MysteryEventsCantUse[] = _("MYSTERY EVENTS can't be used while\nthe Wireless Adapter is attached."); -const u8 gText_UpdatingSaveExternalData[] = _("Updating save file using external\ndata. Please wait."); // Unused -const u8 gText_SaveFileUpdated[] = _("The save file has been updated."); // Unused -const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded."); -const u8 gText_SaveFileErased[] = _("The save file has been erased\ndue to corruption or damage."); -const u8 gJPText_No1MSubCircuit[] = _("1Mサブきばんが ささっていません!"); -const u8 gText_BatteryRunDry[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur."); const u8 gText_Player[] = _("PLAYER"); // Unused const u8 gText_Pokedex[] = _("POKéDEX"); // Unused const u8 gText_Time[] = _("TIME"); @@ -55,48 +40,6 @@ ALIGNED(4) const u8 gText_NextBack[] = _("{A_BUTTON}NEXT {B_BUTTON}BACK"); // Un ALIGNED(4) const u8 gText_PickNextCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL"); ALIGNED(4) const u8 gText_PickCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL"); ALIGNED(4) const u8 gText_AButtonExit[] = _("{A_BUTTON}EXIT"); -const u8 gText_BirchBoy[] = _("BOY"); -const u8 gText_BirchGirl[] = _("GIRL"); -const u8 gText_DefaultNameStu[] = _("STU"); -const u8 gText_DefaultNameMilton[] = _("MILTON"); -const u8 gText_DefaultNameTom[] = _("TOM"); -const u8 gText_DefaultNameKenny[] = _("KENNY"); -const u8 gText_DefaultNameReid[] = _("REID"); -const u8 gText_DefaultNameJude[] = _("JUDE"); -const u8 gText_DefaultNameJaxson[] = _("JAXSON"); -const u8 gText_DefaultNameEaston[] = _("EASTON"); -const u8 gText_DefaultNameWalker[] = _("WALKER"); -const u8 gText_DefaultNameTeru[] = _("TERU"); -const u8 gText_DefaultNameJohnny[] = _("JOHNNY"); -const u8 gText_DefaultNameBrett[] = _("BRETT"); -const u8 gText_DefaultNameSeth[] = _("SETH"); -const u8 gText_DefaultNameTerry[] = _("TERRY"); -const u8 gText_DefaultNameCasey[] = _("CASEY"); -const u8 gText_DefaultNameDarren[] = _("DARREN"); -const u8 gText_DefaultNameLandon[] = _("LANDON"); -const u8 gText_DefaultNameCollin[] = _("COLLIN"); -const u8 gText_DefaultNameStanley[] = _("STANLEY"); -const u8 gText_DefaultNameQuincy[] = _("QUINCY"); -const u8 gText_DefaultNameKimmy[] = _("KIMMY"); -const u8 gText_DefaultNameTiara[] = _("TIARA"); -const u8 gText_DefaultNameBella[] = _("BELLA"); -const u8 gText_DefaultNameJayla[] = _("JAYLA"); -const u8 gText_DefaultNameAllie[] = _("ALLIE"); -const u8 gText_DefaultNameLianna[] = _("LIANNA"); -const u8 gText_DefaultNameSara[] = _("SARA"); -const u8 gText_DefaultNameMonica[] = _("MONICA"); -const u8 gText_DefaultNameCamila[] = _("CAMILA"); -const u8 gText_DefaultNameAubree[] = _("AUBREE"); -const u8 gText_DefaultNameRuthie[] = _("RUTHIE"); -const u8 gText_DefaultNameHazel[] = _("HAZEL"); -const u8 gText_DefaultNameNadine[] = _("NADINE"); -const u8 gText_DefaultNameTanja[] = _("TANJA"); -const u8 gText_DefaultNameYasmin[] = _("YASMIN"); -const u8 gText_DefaultNameNicola[] = _("NICOLA"); -const u8 gText_DefaultNameLillie[] = _("LILLIE"); -const u8 gText_DefaultNameTerra[] = _("TERRA"); -const u8 gText_DefaultNameLucy[] = _("LUCY"); -const u8 gText_DefaultNameHalie[] = _("HALIE"); const u8 gText_ThisIsAPokemon[] = _("This is what we call a “POKéMON.”{PAUSE 96}\p"); const u8 gText_5MarksPokemon[] = _("????? POKéMON"); const u8 gText_UnkHeight[] = _("{CLEAR_TO 0x0C}??'??”"); @@ -1378,10 +1321,6 @@ const u8 gText_BattleArenaDesc[] = _("Win battles with teamed-up POKéMON!\nYour const u8 gText_BattleFactoryDesc[] = _("Aim for victory using rental POKéMON!\nYour knowledge will be tested."); const u8 gText_BattlePikeDesc[] = _("Select one of three paths to battle!\nYour luck will be tested."); const u8 gText_BattlePyramidDesc[] = _("Aim for the top with exploration!\nYour bravery will be tested."); -const u8 gText_ContinueMenuPlayer[] = _("PLAYER"); -const u8 gText_ContinueMenuTime[] = _("TIME"); -const u8 gText_ContinueMenuPokedex[] = _("POKéDEX"); -const u8 gText_ContinueMenuBadges[] = _("BADGES"); const u8 gText_Powder[] = _("POWDER"); const u8 gText_BerryPickingRecords[] = _("DODRIO BERRY-PICKING RECORDS"); const u8 gText_BerriesPicked[] = _("BERRIES picked:"); From 36aea8b68a329adea8d0bed855c7470253160ef1 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Thu, 8 Aug 2024 08:48:01 -0400 Subject: [PATCH 060/225] Changed single-use berry blender strings to be COMPOUND_STRINGs (#4963) * Turned Berry Blender NPC names into COMPOUND_STRINGS * Moved more berry blender unused text to the unused text section * Moved more Berry Blender text to Compound Strings * Revert "Moved more Berry Blender text to Compound Strings" This reverts commit d46c3f979158639b03eadba5b4c8140515c31a37. * Removed unused Berry Blender text --- src/berry_blender.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/src/berry_blender.c b/src/berry_blender.c index 0af3fd3ba6..a34afcf998 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -255,35 +255,20 @@ static const u16 sBlenderOuter_Pal[] = INCBIN_U16("graphics/berry_blender/outer. static const u16 sUnused_Pal[] = INCBIN_U16("graphics/berry_blender/unused.gbapal"); static const u16 sEmpty_Pal[16 * 14] = {0}; -// unused text -static const u8 sUnusedText_YesNo[] = _("YES\nNO"); -static const u8 sUnusedText_2[] = _("▶"); -static const u8 sUnusedText_Space[] = _(" "); -static const u8 sUnusedText_Terminating[] = _("Terminating."); -static const u8 sUnusedText_LinkPartnerNotFound[] = _("Link partner(s) not found.\nPlease try again.\p"); - static const u8 sText_BerryBlenderStart[] = _("Starting up the BERRY BLENDER.\pPlease select a BERRY from your BAG\nto put in the BERRY BLENDER.\p"); static const u8 sText_NewParagraph[] = _("\p"); static const u8 sText_WasMade[] = _(" was made!"); -static const u8 sText_Mister[] = _("MISTER"); -static const u8 sText_Laddie[] = _("LADDIE"); -static const u8 sText_Lassie[] = _("LASSIE"); -static const u8 sText_Master[] = _("MASTER"); -static const u8 sText_Dude[] = _("DUDE"); -static const u8 sText_Miss[] = _("MISS"); static const u8 *const sBlenderOpponentsNames[] = { - [BLENDER_MISTER] = sText_Mister, - [BLENDER_LADDIE] = sText_Laddie, - [BLENDER_LASSIE] = sText_Lassie, - [BLENDER_MASTER] = sText_Master, - [BLENDER_DUDE] = sText_Dude, - [BLENDER_MISS] = sText_Miss + [BLENDER_MISTER] = COMPOUND_STRING("MISTER"), + [BLENDER_LADDIE] = COMPOUND_STRING("LADDIE"), + [BLENDER_LASSIE] = COMPOUND_STRING("LASSIE"), + [BLENDER_MASTER] = COMPOUND_STRING("MASTER"), + [BLENDER_DUDE] = COMPOUND_STRING("DUDE"), + [BLENDER_MISS] = COMPOUND_STRING("MISS"), }; -static const u8 sText_PressAToStart[] = _("Press the A Button to start."); -static const u8 sText_PleaseWaitAWhile[] = _("Please wait a while."); static const u8 sText_CommunicationStandby[] = _("Communication standby…"); static const u8 sText_WouldLikeToBlendAnotherBerry[] = _("Would you like to blend another BERRY?"); static const u8 sText_RunOutOfBerriesForBlending[] = _("You've run out of BERRIES for\nblending in the BERRY BLENDER.\p"); @@ -291,7 +276,6 @@ static const u8 sText_YourPokeblockCaseIsFull[] = _("Your {POKEBLOCK} CASE is fu static const u8 sText_HasNoBerriesToPut[] = _(" has no BERRIES to put in\nthe BERRY BLENDER."); static const u8 sText_ApostropheSPokeblockCaseIsFull[] = _("'s {POKEBLOCK} CASE is full.\p"); static const u8 sText_BlendingResults[] = _("RESULTS OF BLENDING"); -static const u8 sText_BerryUsed[] = _("BERRY USED"); static const u8 sText_SpaceBerry[] = _(" BERRY"); static const u8 sText_Time[] = _("Time:"); static const u8 sText_Min[] = _(" min. "); @@ -300,7 +284,6 @@ static const u8 sText_MaximumSpeed[] = _("MAXIMUM SPEED"); static const u8 sText_RPM[] = _(" RPM"); static const u8 sText_Dot[] = _("."); static const u8 sText_NewLine[] = _("\n"); -static const u8 sText_Space[] = _(" "); static const u8 sText_Ranking[] = _("RANKING"); static const u8 sText_TheLevelIs[] = _("The level is "); static const u8 sText_TheFeelIs[] = _(", and the feel is "); From 182809b515c06cd241cb37345679741c40c57460 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 8 Aug 2024 14:46:22 -0400 Subject: [PATCH 061/225] Made perfect IV count into a granular setting (#5115) * Made perfect IV count into a granular setting * Fixed optional parameter comment in SPECIES_NONE --- include/constants/pokemon.h | 4 + include/pokemon.h | 4 +- src/data/pokemon/species_info.h | 2 +- .../pokemon/species_info/gen_1_families.h | 16 +- .../pokemon/species_info/gen_2_families.h | 6 + .../pokemon/species_info/gen_3_families.h | 18 ++ .../pokemon/species_info/gen_4_families.h | 132 ++++++++------- .../pokemon/species_info/gen_5_families.h | 140 ++++++++------- .../pokemon/species_info/gen_6_families.h | 13 ++ .../pokemon/species_info/gen_7_families.h | 160 +++++++++++------- .../pokemon/species_info/gen_8_families.h | 22 +++ .../pokemon/species_info/gen_9_families.h | 14 ++ src/pokemon.c | 24 +-- 13 files changed, 355 insertions(+), 200 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 81671e2eb4..9179d628b2 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -335,6 +335,10 @@ enum EvolutionMode { // Used as a signal for givemon to generate a default ability by personality. #define NUM_ABILITY_PERSONALITY 0xFF +#if P_LEGENDARY_PERFECT_IVS >= GEN_6 #define LEGENDARY_PERFECT_IV_COUNT 3 +#else +#define LEGENDARY_PERFECT_IV_COUNT 0 +#endif #endif // GUARD_CONSTANTS_POKEMON_H diff --git a/include/pokemon.h b/include/pokemon.h index 4be40addbf..b3b9c18734 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -439,11 +439,11 @@ struct SpeciesInfo /*0xC4*/ u32 isHisuianForm:1; u32 isPaldeanForm:1; u32 cannotBeTraded:1; - u32 allPerfectIVs:1; + u32 perfectIVCount:3; // This species will always generate with the specified amount of perfect IVs. u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set. u32 tmIlliterate:1; // This species will be unable to learn the universal moves. u32 isFrontierBanned:1; // This species is not allowed to participate in Battle Frontier facilities. - u32 padding4:14; + u32 padding4:12; // Move Data /* 0x80 */ const struct LevelUpMove *levelUpLearnset; /* 0x84 */ const u16 *teachableLearnset; diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 4f21223eee..61da487389 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -211,7 +211,7 @@ const struct SpeciesInfo gSpeciesInfo[] = {EVO_ITEM, ITEM_MOOMOO_MILK, SPECIES_NONE}), //.formSpeciesIdTable = sNoneFormSpeciesIdTable, //.formChangeTable = sNoneFormChangeTable, - .allPerfectIVs = TRUE, + //.perfectIVCount = NUM_STATS, }, */ }; diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index e35bb848b7..5a6d447106 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2090,6 +2090,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Raticate) .isTotem = TRUE, .isAlolanForm = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRaticateAlolanLevelUpLearnset, .teachableLearnset = sRaticateAlolanTeachableLearnset, .formSpeciesIdTable = sRaticateFormSpeciesIdTable, @@ -3411,7 +3412,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif FOOTPRINT(Pikachu) .cannotBeTraded = TRUE, - .allPerfectIVs = TRUE, + .perfectIVCount = NUM_STATS, .levelUpLearnset = sPikachuLevelUpLearnset, .teachableLearnset = sPikachuTeachableLearnset, .formSpeciesIdTable = sPikachuFormSpeciesIdTable, @@ -11836,6 +11837,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = FOOTPRINT(Marowak) .isTotem = TRUE, .isAlolanForm = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMarowakAlolanLevelUpLearnset, .teachableLearnset = sMarowakAlolanTeachableLearnset, .formSpeciesIdTable = sMarowakFormSpeciesIdTable, @@ -15575,7 +15577,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif FOOTPRINT(Eevee) .cannotBeTraded = TRUE, - .allPerfectIVs = TRUE, + .perfectIVCount = NUM_STATS, .levelUpLearnset = sEeveeLevelUpLearnset, .teachableLearnset = sEeveeTeachableLearnset, .eggMoveLearnset = sEeveeEggMoveLearnset, @@ -16923,6 +16925,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Articuno ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sArticunoLevelUpLearnset, .teachableLearnset = sArticunoTeachableLearnset, .formSpeciesIdTable = sArticunoFormSpeciesIdTable, @@ -16988,6 +16991,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .isLegendary = TRUE, .isGalarianForm = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sArticunoGalarianLevelUpLearnset, .teachableLearnset = sArticunoGalarianTeachableLearnset, .formSpeciesIdTable = sArticunoFormSpeciesIdTable, @@ -17064,6 +17068,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Zapdos ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZapdosLevelUpLearnset, .teachableLearnset = sZapdosTeachableLearnset, .formSpeciesIdTable = sZapdosFormSpeciesIdTable, @@ -17128,6 +17133,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .isLegendary = TRUE, .isGalarianForm = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZapdosGalarianLevelUpLearnset, .teachableLearnset = sZapdosGalarianTeachableLearnset, .formSpeciesIdTable = sZapdosFormSpeciesIdTable, @@ -17199,6 +17205,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_Moltres ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMoltresLevelUpLearnset, .teachableLearnset = sMoltresTeachableLearnset, .formSpeciesIdTable = sMoltresFormSpeciesIdTable, @@ -17263,6 +17270,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .isLegendary = TRUE, .isGalarianForm = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMoltresGalarianLevelUpLearnset, .teachableLearnset = sMoltresGalarianTeachableLearnset, .formSpeciesIdTable = sMoltresFormSpeciesIdTable, @@ -17529,6 +17537,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMewtwoLevelUpLearnset, .teachableLearnset = sMewtwoTeachableLearnset, .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, @@ -17587,6 +17596,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMewtwoLevelUpLearnset, .teachableLearnset = sMewtwoTeachableLearnset, .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, @@ -17645,6 +17655,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMewtwoLevelUpLearnset, .teachableLearnset = sMewtwoTeachableLearnset, .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, @@ -17721,6 +17732,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMewLevelUpLearnset, .teachableLearnset = sMewTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 1bfbb41bec..ee4ab08f38 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -6772,6 +6772,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Raikou ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRaikouLevelUpLearnset, .teachableLearnset = sRaikouTeachableLearnset, }, @@ -6846,6 +6847,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Entei ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnteiLevelUpLearnset, .teachableLearnset = sEnteiTeachableLearnset, }, @@ -6920,6 +6922,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gShinyOverworldPalette_Suicune ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSuicuneLevelUpLearnset, .teachableLearnset = sSuicuneTeachableLearnset, }, @@ -7243,6 +7246,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLugiaLevelUpLearnset, .teachableLearnset = sLugiaTeachableLearnset, }, @@ -7316,6 +7320,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHoOhLevelUpLearnset, .teachableLearnset = sHoOhTeachableLearnset, }, @@ -7389,6 +7394,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCelebiLevelUpLearnset, .teachableLearnset = sCelebiTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 8a23bb05fd..667dc54d0e 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -10212,6 +10212,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Regirock ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegirockLevelUpLearnset, .teachableLearnset = sRegirockTeachableLearnset, }, @@ -10281,6 +10282,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Regice ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegiceLevelUpLearnset, .teachableLearnset = sRegiceTeachableLearnset, }, @@ -10351,6 +10353,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Registeel ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegisteelLevelUpLearnset, .teachableLearnset = sRegisteelTeachableLearnset, }, @@ -10421,6 +10424,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Latias ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiasLevelUpLearnset, .teachableLearnset = sLatiasTeachableLearnset, .formSpeciesIdTable = sLatiasFormSpeciesIdTable, @@ -10479,6 +10483,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Latias) .isLegendary = TRUE, .isMegaEvolution = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiasLevelUpLearnset, .teachableLearnset = sLatiasTeachableLearnset, .formSpeciesIdTable = sLatiasFormSpeciesIdTable, @@ -10552,6 +10557,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_Latios ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiosLevelUpLearnset, .teachableLearnset = sLatiosTeachableLearnset, .formSpeciesIdTable = sLatiosFormSpeciesIdTable, @@ -10610,6 +10616,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = FOOTPRINT(Latios) .isLegendary = TRUE, .isMegaEvolution = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiosLevelUpLearnset, .teachableLearnset = sLatiosTeachableLearnset, .formSpeciesIdTable = sLatiosFormSpeciesIdTable, @@ -10684,6 +10691,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyogreLevelUpLearnset, .teachableLearnset = sKyogreTeachableLearnset, .formSpeciesIdTable = sKyogreFormSpeciesIdTable, @@ -10741,6 +10749,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .isLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyogreLevelUpLearnset, .teachableLearnset = sKyogreTeachableLearnset, .formSpeciesIdTable = sKyogreFormSpeciesIdTable, @@ -10814,6 +10823,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGroudonLevelUpLearnset, .teachableLearnset = sGroudonTeachableLearnset, .formSpeciesIdTable = sGroudonFormSpeciesIdTable, @@ -10872,6 +10882,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .isLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGroudonLevelUpLearnset, .teachableLearnset = sGroudonTeachableLearnset, .formSpeciesIdTable = sGroudonFormSpeciesIdTable, @@ -10948,6 +10959,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRayquazaLevelUpLearnset, .teachableLearnset = sRayquazaTeachableLearnset, .formSpeciesIdTable = sRayquazaFormSpeciesIdTable, @@ -11008,6 +11020,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRayquazaLevelUpLearnset, .teachableLearnset = sRayquazaTeachableLearnset, .formSpeciesIdTable = sRayquazaFormSpeciesIdTable, @@ -11084,6 +11097,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sJirachiLevelUpLearnset, .teachableLearnset = sJirachiTeachableLearnset, }, @@ -11154,6 +11168,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDeoxysNormalLevelUpLearnset, .teachableLearnset = sDeoxysNormalTeachableLearnset, .formSpeciesIdTable = sDeoxysFormSpeciesIdTable, @@ -11215,6 +11230,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDeoxysAttackLevelUpLearnset, .teachableLearnset = sDeoxysAttackTeachableLearnset, .formSpeciesIdTable = sDeoxysFormSpeciesIdTable, @@ -11276,6 +11292,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDeoxysDefenseLevelUpLearnset, .teachableLearnset = sDeoxysDefenseTeachableLearnset, .formSpeciesIdTable = sDeoxysFormSpeciesIdTable, @@ -11337,6 +11354,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDeoxysSpeedLevelUpLearnset, .teachableLearnset = sDeoxysSpeedTeachableLearnset, .formSpeciesIdTable = sDeoxysFormSpeciesIdTable, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index faa9ed73b4..828d098a5a 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -5235,6 +5235,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Uxie ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUxieLevelUpLearnset, .teachableLearnset = sUxieTeachableLearnset, }, @@ -5307,6 +5308,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Mesprit ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMespritLevelUpLearnset, .teachableLearnset = sMespritTeachableLearnset, }, @@ -5378,6 +5380,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Azelf ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sAzelfLevelUpLearnset, .teachableLearnset = sAzelfTeachableLearnset, }, @@ -5450,6 +5453,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDialgaLevelUpLearnset, .teachableLearnset = sDialgaTeachableLearnset, .formSpeciesIdTable = sDialgaFormSpeciesIdTable, @@ -5514,6 +5518,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDialgaLevelUpLearnset, .teachableLearnset = sDialgaTeachableLearnset, .formSpeciesIdTable = sDialgaFormSpeciesIdTable, @@ -5588,6 +5593,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPalkiaLevelUpLearnset, .teachableLearnset = sPalkiaTeachableLearnset, .formSpeciesIdTable = sPalkiaFormSpeciesIdTable, @@ -5652,6 +5658,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPalkiaLevelUpLearnset, .teachableLearnset = sPalkiaTeachableLearnset, .formSpeciesIdTable = sPalkiaFormSpeciesIdTable, @@ -5723,6 +5730,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Heatran ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHeatranLevelUpLearnset, .teachableLearnset = sHeatranTeachableLearnset, }, @@ -5792,6 +5800,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Regigigas ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegigigasLevelUpLearnset, .teachableLearnset = sRegigigasTeachableLearnset, }, @@ -5864,6 +5873,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGiratinaLevelUpLearnset, .teachableLearnset = sGiratinaTeachableLearnset, .formSpeciesIdTable = sGiratinaFormSpeciesIdTable, @@ -5929,6 +5939,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGiratinaLevelUpLearnset, .teachableLearnset = sGiratinaTeachableLearnset, .formSpeciesIdTable = sGiratinaFormSpeciesIdTable, @@ -6001,6 +6012,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gShinyOverworldPalette_Cresselia ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCresseliaLevelUpLearnset, .teachableLearnset = sCresseliaTeachableLearnset, }, @@ -6072,6 +6084,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPhioneLevelUpLearnset, .teachableLearnset = sPhioneTeachableLearnset, }, @@ -6141,6 +6154,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sManaphyLevelUpLearnset, .teachableLearnset = sManaphyTeachableLearnset, }, @@ -6213,6 +6227,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDarkraiLevelUpLearnset, .teachableLearnset = sDarkraiTeachableLearnset, }, @@ -6287,6 +6302,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sShayminLandLevelUpLearnset, .teachableLearnset = sShayminLandTeachableLearnset, .formSpeciesIdTable = sShayminFormSpeciesIdTable, @@ -6350,6 +6366,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = FOOTPRINT(Shaymin) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sShayminSkyLevelUpLearnset, .teachableLearnset = sShayminSkyTeachableLearnset, .formSpeciesIdTable = sShayminFormSpeciesIdTable, @@ -6375,63 +6392,64 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 1, #endif -#define ARCEUS_SPECIES_INFO(type, typeName, iconPal) \ - { \ - .baseHP = 120, \ - .baseAttack = 120, \ - .baseDefense = 120, \ - .baseSpeed = 120, \ - .baseSpAttack = 120, \ - .baseSpDefense = 120, \ - .types = MON_TYPES(type), \ - .catchRate = 3, \ - .expYield = ARCEUS_EXP_YIELD, \ - .evYield_HP = 3, \ - .genderRatio = MON_GENDERLESS, \ - .eggCycles = 120, \ - .friendship = 0, \ - .growthRate = GROWTH_SLOW, \ - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ - .abilities = { ABILITY_MULTITYPE, ABILITY_NONE, ABILITY_NONE }, \ - .bodyColor = BODY_COLOR_WHITE, \ - .speciesName = _("Arceus"), \ - .cryId = CRY_ARCEUS, \ - .natDexNum = NATIONAL_DEX_ARCEUS, \ - .categoryName = _("Alpha"), \ - .height = 32, \ - .weight = 3200, \ - .description = gArceusPokedexText, \ - .pokemonScale = 256, \ - .pokemonOffset = 0, \ - .trainerScale = 495, \ - .trainerOffset = 10, \ - .frontPic = gMonFrontPic_Arceus, \ - .frontPicSize = MON_COORDS_SIZE(64, 64), \ - .frontPicYOffset = 0, \ - .frontAnimFrames = sAnims_Arceus, \ - .frontAnimId = ANIM_GROW_VIBRATE, \ - .backPic = gMonBackPic_Arceus, \ - .backPicSize = MON_COORDS_SIZE(64, 64), \ - .backPicYOffset = 3, \ - .backAnimId = BACK_ANIM_GROW_STUTTER, \ - .palette = gMonPalette_Arceus ##typeName, \ - .shinyPalette = gMonShinyPalette_Arceus ##typeName, \ - ARCEUS_ICON(typeName, iconPal) \ - FOOTPRINT(Arceus) \ - OVERWORLD( \ - sPicTable_Arceus ##typeName, \ - SIZE_64x64, \ - SHADOW_SIZE_M, \ - TRACKS_FOOT, \ - gOverworldPalette_Arceus ##typeName, \ - gShinyOverworldPalette_Arceus ##typeName \ - ) \ - .levelUpLearnset = sArceusLevelUpLearnset, \ - .teachableLearnset = sArceusTeachableLearnset, \ - .formSpeciesIdTable = sArceusFormSpeciesIdTable, \ - .formChangeTable = sArceusFormChangeTable, \ - .isMythical = TRUE, \ - .isFrontierBanned = TRUE, \ +#define ARCEUS_SPECIES_INFO(type, typeName, iconPal) \ + { \ + .baseHP = 120, \ + .baseAttack = 120, \ + .baseDefense = 120, \ + .baseSpeed = 120, \ + .baseSpAttack = 120, \ + .baseSpDefense = 120, \ + .types = MON_TYPES(type), \ + .catchRate = 3, \ + .expYield = ARCEUS_EXP_YIELD, \ + .evYield_HP = 3, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ + .abilities = { ABILITY_MULTITYPE, ABILITY_NONE, ABILITY_NONE }, \ + .bodyColor = BODY_COLOR_WHITE, \ + .speciesName = _("Arceus"), \ + .cryId = CRY_ARCEUS, \ + .natDexNum = NATIONAL_DEX_ARCEUS, \ + .categoryName = _("Alpha"), \ + .height = 32, \ + .weight = 3200, \ + .description = gArceusPokedexText, \ + .pokemonScale = 256, \ + .pokemonOffset = 0, \ + .trainerScale = 495, \ + .trainerOffset = 10, \ + .frontPic = gMonFrontPic_Arceus, \ + .frontPicSize = MON_COORDS_SIZE(64, 64), \ + .frontPicYOffset = 0, \ + .frontAnimFrames = sAnims_Arceus, \ + .frontAnimId = ANIM_GROW_VIBRATE, \ + .backPic = gMonBackPic_Arceus, \ + .backPicSize = MON_COORDS_SIZE(64, 64), \ + .backPicYOffset = 3, \ + .backAnimId = BACK_ANIM_GROW_STUTTER, \ + .palette = gMonPalette_Arceus ##typeName, \ + .shinyPalette = gMonShinyPalette_Arceus ##typeName, \ + ARCEUS_ICON(typeName, iconPal) \ + FOOTPRINT(Arceus) \ + OVERWORLD( \ + sPicTable_Arceus ##typeName, \ + SIZE_64x64, \ + SHADOW_SIZE_M, \ + TRACKS_FOOT, \ + gOverworldPalette_Arceus ##typeName, \ + gShinyOverworldPalette_Arceus ##typeName \ + ) \ + .levelUpLearnset = sArceusLevelUpLearnset, \ + .teachableLearnset = sArceusTeachableLearnset, \ + .formSpeciesIdTable = sArceusFormSpeciesIdTable, \ + .formChangeTable = sArceusFormChangeTable, \ + .isMythical = TRUE, \ + .isFrontierBanned = TRUE, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } [SPECIES_ARCEUS_NORMAL] = ARCEUS_SPECIES_INFO(TYPE_NORMAL, Normal, 1), diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index ffa2dd4a1c..2495cfa961 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -62,6 +62,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sVictiniLevelUpLearnset, .teachableLearnset = sVictiniTeachableLearnset, }, @@ -10795,6 +10796,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Cobalion ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCobalionLevelUpLearnset, .teachableLearnset = sCobalionTeachableLearnset, }, @@ -10858,6 +10860,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Terrakion ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerrakionLevelUpLearnset, .teachableLearnset = sTerrakionTeachableLearnset, }, @@ -10921,6 +10924,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_Virizion ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sVirizionLevelUpLearnset, .teachableLearnset = sVirizionTeachableLearnset, }, @@ -10985,6 +10989,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_TornadusIncarnate ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTornadusLevelUpLearnset, .teachableLearnset = sTornadusTeachableLearnset, .formSpeciesIdTable = sTornadusFormSpeciesIdTable, @@ -11040,6 +11045,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 1, FOOTPRINT(Tornadus) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTornadusLevelUpLearnset, .teachableLearnset = sTornadusTeachableLearnset, .formSpeciesIdTable = sTornadusFormSpeciesIdTable, @@ -11106,6 +11112,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_ThundurusIncarnate ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sThundurusLevelUpLearnset, .teachableLearnset = sThundurusTeachableLearnset, .formSpeciesIdTable = sThundurusFormSpeciesIdTable, @@ -11162,6 +11169,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, FOOTPRINT(Thundurus) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sThundurusLevelUpLearnset, .teachableLearnset = sThundurusTeachableLearnset, .formSpeciesIdTable = sThundurusFormSpeciesIdTable, @@ -11228,6 +11236,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sReshiramLevelUpLearnset, .teachableLearnset = sReshiramTeachableLearnset, }, @@ -11292,6 +11301,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZekromLevelUpLearnset, .teachableLearnset = sZekromTeachableLearnset, }, @@ -11356,6 +11366,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gShinyOverworldPalette_LandorusIncarnate ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLandorusLevelUpLearnset, .teachableLearnset = sLandorusTeachableLearnset, .formSpeciesIdTable = sLandorusFormSpeciesIdTable, @@ -11411,6 +11422,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 0, FOOTPRINT(Landorus) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLandorusLevelUpLearnset, .teachableLearnset = sLandorusTeachableLearnset, .formSpeciesIdTable = sLandorusFormSpeciesIdTable, @@ -11480,6 +11492,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyuremLevelUpLearnset, .teachableLearnset = sKyuremTeachableLearnset, .formSpeciesIdTable = sKyuremFormSpeciesIdTable, @@ -11544,6 +11557,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyuremWhiteLevelUpLearnset, .teachableLearnset = sKyuremTeachableLearnset, .formSpeciesIdTable = sKyuremFormSpeciesIdTable, @@ -11607,6 +11621,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyuremBlackLevelUpLearnset, .teachableLearnset = sKyuremTeachableLearnset, .formSpeciesIdTable = sKyuremFormSpeciesIdTable, @@ -11673,6 +11688,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKeldeoLevelUpLearnset, .teachableLearnset = sKeldeoTeachableLearnset, .formSpeciesIdTable = sKeldeoFormSpeciesIdTable, @@ -11730,6 +11746,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = FOOTPRINT(Keldeo) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKeldeoLevelUpLearnset, .teachableLearnset = sKeldeoTeachableLearnset, .formSpeciesIdTable = sKeldeoFormSpeciesIdTable, @@ -11802,6 +11819,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMeloettaLevelUpLearnset, .teachableLearnset = sMeloettaTeachableLearnset, .formSpeciesIdTable = sMeloettaFormSpeciesIdTable, @@ -11871,6 +11889,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMeloettaLevelUpLearnset, .teachableLearnset = sMeloettaTeachableLearnset, .formSpeciesIdTable = sMeloettaFormSpeciesIdTable, @@ -11879,66 +11898,67 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT -#define GENESECT_SPECIES_INFO(form) \ - { \ - .baseHP = 71, \ - .baseAttack = 120, \ - .baseDefense = 95, \ - .baseSpeed = 99, \ - .baseSpAttack = 120, \ - .baseSpDefense = 95, \ - .types = MON_TYPES(TYPE_BUG, TYPE_STEEL), \ - .catchRate = 3, \ - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, \ - .evYield_Attack = 1, \ - .evYield_Speed = 1, \ - .evYield_SpAttack = 1, \ - .genderRatio = MON_GENDERLESS, \ - .eggCycles = 120, \ - .friendship = 0, \ - .growthRate = GROWTH_SLOW, \ - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ - .abilities = { ABILITY_DOWNLOAD, ABILITY_NONE, ABILITY_NONE }, \ - .bodyColor = BODY_COLOR_PURPLE, \ - .speciesName = _("Genesect"), \ - .cryId = CRY_GENESECT, \ - .natDexNum = NATIONAL_DEX_GENESECT, \ - .categoryName = _("Paleozoic"), \ - .height = 15, \ - .weight = 825, \ - .description = gGenesectPokedexText, \ - .pokemonScale = 268, \ - .pokemonOffset = 2, \ - .trainerScale = 271, \ - .trainerOffset = 0, \ - .frontPic = gMonFrontPic_Genesect, \ - .frontPicSize = MON_COORDS_SIZE(56, 64), \ - .frontPicYOffset = 0, \ - .frontAnimFrames = sAnims_Genesect, \ - .frontAnimId = ANIM_H_VIBRATE, \ - .backPic = gMonBackPic_Genesect, \ - .backPicSize = MON_COORDS_SIZE(64, 48), \ - .backPicYOffset = 8, \ - .backAnimId = BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, \ - .palette = gMonPalette_##form, \ - .shinyPalette = gMonShinyPalette_##form, \ - .iconSprite = gMonIcon_Genesect, \ - .iconPalIndex = 2, \ - FOOTPRINT(Genesect) \ - OVERWORLD( \ - sPicTable_Genesect, \ - SIZE_32x32, \ - SHADOW_SIZE_M, \ - TRACKS_FOOT, \ - gOverworldPalette_Genesect, \ - gShinyOverworldPalette_Genesect \ - ) \ - .levelUpLearnset = sGenesectLevelUpLearnset, \ - .teachableLearnset = sGenesectTeachableLearnset, \ - .formSpeciesIdTable = sGenesectFormSpeciesIdTable, \ - .formChangeTable = sGenesectFormChangeTable, \ - .isMythical = TRUE, \ - .isFrontierBanned = TRUE, \ +#define GENESECT_SPECIES_INFO(form) \ + { \ + .baseHP = 71, \ + .baseAttack = 120, \ + .baseDefense = 95, \ + .baseSpeed = 99, \ + .baseSpAttack = 120, \ + .baseSpDefense = 95, \ + .types = MON_TYPES(TYPE_BUG, TYPE_STEEL), \ + .catchRate = 3, \ + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, \ + .evYield_Attack = 1, \ + .evYield_Speed = 1, \ + .evYield_SpAttack = 1, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ + .abilities = { ABILITY_DOWNLOAD, ABILITY_NONE, ABILITY_NONE }, \ + .bodyColor = BODY_COLOR_PURPLE, \ + .speciesName = _("Genesect"), \ + .cryId = CRY_GENESECT, \ + .natDexNum = NATIONAL_DEX_GENESECT, \ + .categoryName = _("Paleozoic"), \ + .height = 15, \ + .weight = 825, \ + .description = gGenesectPokedexText, \ + .pokemonScale = 268, \ + .pokemonOffset = 2, \ + .trainerScale = 271, \ + .trainerOffset = 0, \ + .frontPic = gMonFrontPic_Genesect, \ + .frontPicSize = MON_COORDS_SIZE(56, 64), \ + .frontPicYOffset = 0, \ + .frontAnimFrames = sAnims_Genesect, \ + .frontAnimId = ANIM_H_VIBRATE, \ + .backPic = gMonBackPic_Genesect, \ + .backPicSize = MON_COORDS_SIZE(64, 48), \ + .backPicYOffset = 8, \ + .backAnimId = BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, \ + .palette = gMonPalette_##form, \ + .shinyPalette = gMonShinyPalette_##form, \ + .iconSprite = gMonIcon_Genesect, \ + .iconPalIndex = 2, \ + FOOTPRINT(Genesect) \ + OVERWORLD( \ + sPicTable_Genesect, \ + SIZE_32x32, \ + SHADOW_SIZE_M, \ + TRACKS_FOOT, \ + gOverworldPalette_Genesect, \ + gShinyOverworldPalette_Genesect \ + ) \ + .levelUpLearnset = sGenesectLevelUpLearnset, \ + .teachableLearnset = sGenesectTeachableLearnset, \ + .formSpeciesIdTable = sGenesectFormSpeciesIdTable, \ + .formChangeTable = sGenesectFormChangeTable, \ + .isMythical = TRUE, \ + .isFrontierBanned = TRUE, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } [SPECIES_GENESECT] = GENESECT_SPECIES_INFO(Genesect), diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 46c776639c..c984ce9547 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -5280,6 +5280,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sXerneasLevelUpLearnset, .teachableLearnset = sXerneasTeachableLearnset, .formSpeciesIdTable = sXerneasFormSpeciesIdTable, @@ -5340,6 +5341,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sXerneasLevelUpLearnset, .teachableLearnset = sXerneasTeachableLearnset, .formSpeciesIdTable = sXerneasFormSpeciesIdTable, @@ -5407,6 +5409,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sYveltalLevelUpLearnset, .teachableLearnset = sYveltalTeachableLearnset, }, @@ -5468,6 +5471,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -5528,6 +5532,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -5580,6 +5585,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = FOOTPRINT(Zygarde) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -5633,6 +5639,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = FOOTPRINT(Zygarde) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -5690,6 +5697,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = FOOTPRINT(Zygarde) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -5757,6 +5765,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDiancieLevelUpLearnset, .teachableLearnset = sDiancieTeachableLearnset, .formSpeciesIdTable = sDiancieFormSpeciesIdTable, @@ -5816,6 +5825,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .isMythical = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDiancieLevelUpLearnset, .teachableLearnset = sDiancieTeachableLearnset, .formSpeciesIdTable = sDiancieFormSpeciesIdTable, @@ -5884,6 +5894,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHoopaConfinedLevelUpLearnset, .teachableLearnset = sHoopaConfinedTeachableLearnset, .formSpeciesIdTable = sHoopaFormSpeciesIdTable, @@ -5949,6 +5960,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHoopaUnboundLevelUpLearnset, .teachableLearnset = sHoopaUnboundTeachableLearnset, .formSpeciesIdTable = sHoopaFormSpeciesIdTable, @@ -6015,6 +6027,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sVolcanionLevelUpLearnset, .teachableLearnset = sVolcanionTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 4669051d04..c16220ca62 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -989,6 +989,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Gumshoos ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGumshoosLevelUpLearnset, .teachableLearnset = sGumshoosTeachableLearnset, .formSpeciesIdTable = sGumshoosFormSpeciesIdTable, @@ -1234,6 +1235,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Vikavolt ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sVikavoltLevelUpLearnset, .teachableLearnset = sVikavoltTeachableLearnset, .formSpeciesIdTable = sVikavoltFormSpeciesIdTable, @@ -1781,6 +1783,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Ribombee ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRibombeeLevelUpLearnset, .teachableLearnset = sRibombeeTeachableLearnset, .formSpeciesIdTable = sRibombeeFormSpeciesIdTable, @@ -2641,6 +2644,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Araquanid ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sAraquanidLevelUpLearnset, .teachableLearnset = sAraquanidTeachableLearnset, .formSpeciesIdTable = sAraquanidFormSpeciesIdTable, @@ -2824,6 +2828,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Lurantis ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLurantisLevelUpLearnset, .teachableLearnset = sLurantisTeachableLearnset, .formSpeciesIdTable = sLurantisFormSpeciesIdTable, @@ -3135,6 +3140,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Salazzle ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSalazzleLevelUpLearnset, .teachableLearnset = sSalazzleTeachableLearnset, .formSpeciesIdTable = sSalanditFormSpeciesIdTable, @@ -4018,70 +4024,72 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_TypeNull ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTypeNullLevelUpLearnset, .teachableLearnset = sTypeNullTeachableLearnset, .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_SILVALLY_NORMAL}), }, -#define SILVALLY_SPECIES_INFO(type, _palette) \ - { \ - .baseHP = 95, \ - .baseAttack = 95, \ - .baseDefense = 95, \ - .baseSpeed = 95, \ - .baseSpAttack = 95, \ - .baseSpDefense = 95, \ - .types = MON_TYPES(type), \ - .catchRate = 3, \ - .expYield = 257, \ - .evYield_HP = 3, \ - .genderRatio = MON_GENDERLESS, \ - .eggCycles = 120, \ - .friendship = 0, \ - .growthRate = GROWTH_SLOW, \ - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ - .abilities = { ABILITY_RKS_SYSTEM, ABILITY_NONE, ABILITY_NONE }, \ - .bodyColor = BODY_COLOR_GRAY, \ - .isLegendary = TRUE, \ - .speciesName = _("Silvally"), \ - .cryId = CRY_SILVALLY, \ - .natDexNum = NATIONAL_DEX_SILVALLY, \ - .categoryName = _("Synthetic"), \ - .height = 23, \ - .weight = 1005, \ - .description = (type == TYPE_NORMAL \ - ? gSilvallyNormalPokedexText \ - : gSilvallyMemoryPokedexText), \ - .pokemonScale = 256, \ - .pokemonOffset = 0, \ - .trainerScale = 342, \ - .trainerOffset = 7, \ - .frontPic = gMonFrontPic_Silvally, \ - .frontPicSize = MON_COORDS_SIZE(64, 64), \ - .frontPicYOffset = 0, \ - .frontAnimFrames = sAnims_Silvally, \ - .frontAnimId = ANIM_V_SHAKE, \ - .backPic = gMonBackPic_Silvally, \ - .backPicSize = MON_COORDS_SIZE(56, 64), \ - .backPicYOffset = 0, \ - /*.backAnimId = BACK_ANIM_NONE,*/ \ - .palette = gMonPalette_Silvally##_palette, \ - .shinyPalette = gMonShinyPalette_Silvally##_palette, \ - .iconSprite = gMonIcon_Silvally, \ - .iconPalIndex = 0, \ - FOOTPRINT(Silvally) \ - OVERWORLD( \ - sPicTable_Silvally, \ - SIZE_32x32, \ - SHADOW_SIZE_M, \ - TRACKS_FOOT, \ - gOverworldPalette_Silvally, \ - gShinyOverworldPalette_Silvally \ - ) \ - .levelUpLearnset = sSilvallyLevelUpLearnset, \ - .teachableLearnset = sSilvallyTeachableLearnset, \ - .formSpeciesIdTable = sSilvallyFormSpeciesIdTable, \ - .formChangeTable = sSilvallyFormChangeTable, \ +#define SILVALLY_SPECIES_INFO(type, _palette) \ + { \ + .baseHP = 95, \ + .baseAttack = 95, \ + .baseDefense = 95, \ + .baseSpeed = 95, \ + .baseSpAttack = 95, \ + .baseSpDefense = 95, \ + .types = MON_TYPES(type), \ + .catchRate = 3, \ + .expYield = 257, \ + .evYield_HP = 3, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ + .abilities = { ABILITY_RKS_SYSTEM, ABILITY_NONE, ABILITY_NONE }, \ + .bodyColor = BODY_COLOR_GRAY, \ + .speciesName = _("Silvally"), \ + .cryId = CRY_SILVALLY, \ + .natDexNum = NATIONAL_DEX_SILVALLY, \ + .categoryName = _("Synthetic"), \ + .height = 23, \ + .weight = 1005, \ + .description = (type == TYPE_NORMAL \ + ? gSilvallyNormalPokedexText \ + : gSilvallyMemoryPokedexText), \ + .pokemonScale = 256, \ + .pokemonOffset = 0, \ + .trainerScale = 342, \ + .trainerOffset = 7, \ + .frontPic = gMonFrontPic_Silvally, \ + .frontPicSize = MON_COORDS_SIZE(64, 64), \ + .frontPicYOffset = 0, \ + .frontAnimFrames = sAnims_Silvally, \ + .frontAnimId = ANIM_V_SHAKE, \ + .backPic = gMonBackPic_Silvally, \ + .backPicSize = MON_COORDS_SIZE(56, 64), \ + .backPicYOffset = 0, \ + /*.backAnimId = BACK_ANIM_NONE,*/ \ + .palette = gMonPalette_Silvally##_palette, \ + .shinyPalette = gMonShinyPalette_Silvally##_palette, \ + .iconSprite = gMonIcon_Silvally, \ + .iconPalIndex = 0, \ + FOOTPRINT(Silvally) \ + OVERWORLD( \ + sPicTable_Silvally, \ + SIZE_32x32, \ + SHADOW_SIZE_M, \ + TRACKS_FOOT, \ + gOverworldPalette_Silvally, \ + gShinyOverworldPalette_Silvally \ + ) \ + .isLegendary = TRUE, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ + .levelUpLearnset = sSilvallyLevelUpLearnset, \ + .teachableLearnset = sSilvallyTeachableLearnset, \ + .formSpeciesIdTable = sSilvallyFormSpeciesIdTable, \ + .formChangeTable = sSilvallyFormChangeTable, \ } [SPECIES_SILVALLY_NORMAL] = SILVALLY_SPECIES_INFO(TYPE_NORMAL, Normal), @@ -4455,6 +4463,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Togedemaru ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTogedemaruLevelUpLearnset, .teachableLearnset = sTogedemaruTeachableLearnset, .eggMoveLearnset = sTogedemaruEggMoveLearnset, @@ -4621,6 +4630,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 1, FOOTPRINT(Mimikyu) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMimikyuLevelUpLearnset, .teachableLearnset = sMimikyuTeachableLearnset, .eggMoveLearnset = sMimikyuEggMoveLearnset, @@ -4674,6 +4684,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 1, FOOTPRINT(Mimikyu) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMimikyuLevelUpLearnset, .teachableLearnset = sMimikyuTeachableLearnset, .eggMoveLearnset = sMimikyuEggMoveLearnset, @@ -5113,6 +5124,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_KommoO ) .isTotem = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKommoOLevelUpLearnset, .teachableLearnset = sKommoOTeachableLearnset, .formSpeciesIdTable = sKommoOFormSpeciesIdTable, @@ -5178,6 +5190,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_TapuKoko ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuKokoLevelUpLearnset, .teachableLearnset = sTapuKokoTeachableLearnset, }, @@ -5242,6 +5255,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_TapuLele ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuLeleLevelUpLearnset, .teachableLearnset = sTapuLeleTeachableLearnset, }, @@ -5306,6 +5320,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_TapuBulu ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuBuluLevelUpLearnset, .teachableLearnset = sTapuBuluTeachableLearnset, }, @@ -5371,6 +5386,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_TapuFini ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuFiniLevelUpLearnset, .teachableLearnset = sTapuFiniTeachableLearnset, }, @@ -5437,6 +5453,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isLegendary = TRUE, .tmIlliterate = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmogLevelUpLearnset, .teachableLearnset = sCosmogTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 43, SPECIES_COSMOEM}), @@ -5503,6 +5520,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isLegendary = TRUE, .tmIlliterate = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmoemLevelUpLearnset, .teachableLearnset = sCosmoemTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL_DAY, 53, SPECIES_SOLGALEO}, @@ -5567,6 +5585,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSolgaleoLevelUpLearnset, .teachableLearnset = sSolgaleoTeachableLearnset, }, @@ -5630,6 +5649,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLunalaLevelUpLearnset, .teachableLearnset = sLunalaTeachableLearnset, }, @@ -5694,6 +5714,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Nihilego ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNihilegoLevelUpLearnset, .teachableLearnset = sNihilegoTeachableLearnset, }, @@ -5758,6 +5779,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Buzzwole ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sBuzzwoleLevelUpLearnset, .teachableLearnset = sBuzzwoleTeachableLearnset, }, @@ -5821,6 +5843,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Pheromosa ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPheromosaLevelUpLearnset, .teachableLearnset = sPheromosaTeachableLearnset, }, @@ -5884,6 +5907,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Xurkitree ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sXurkitreeLevelUpLearnset, .teachableLearnset = sXurkitreeTeachableLearnset, }, @@ -5949,6 +5973,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Celesteela ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCelesteelaLevelUpLearnset, .teachableLearnset = sCelesteelaTeachableLearnset, }, @@ -6013,6 +6038,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Kartana ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKartanaLevelUpLearnset, .teachableLearnset = sKartanaTeachableLearnset, }, @@ -6076,6 +6102,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Guzzlord ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGuzzlordLevelUpLearnset, .teachableLearnset = sGuzzlordTeachableLearnset, }, @@ -6143,6 +6170,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNecrozmaLevelUpLearnset, .teachableLearnset = sNecrozmaTeachableLearnset, .formSpeciesIdTable = sNecrozmaFormSpeciesIdTable, @@ -6209,6 +6237,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNecrozmaLevelUpLearnset, .teachableLearnset = sNecrozmaTeachableLearnset, .formSpeciesIdTable = sNecrozmaFormSpeciesIdTable, @@ -6276,6 +6305,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNecrozmaLevelUpLearnset, .teachableLearnset = sNecrozmaTeachableLearnset, .formSpeciesIdTable = sNecrozmaFormSpeciesIdTable, @@ -6339,6 +6369,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isUltraBurst = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNecrozmaLevelUpLearnset, .teachableLearnset = sNecrozmaTeachableLearnset, .formSpeciesIdTable = sNecrozmaFormSpeciesIdTable, @@ -6406,6 +6437,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMagearnaLevelUpLearnset, .teachableLearnset = sMagearnaTeachableLearnset, .formSpeciesIdTable = sMagearnaFormSpeciesIdTable, @@ -6460,6 +6492,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = FOOTPRINT(Magearna) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMagearnaLevelUpLearnset, .teachableLearnset = sMagearnaTeachableLearnset, .formSpeciesIdTable = sMagearnaFormSpeciesIdTable, @@ -6527,6 +6560,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMarshadowLevelUpLearnset, .teachableLearnset = sMarshadowTeachableLearnset, }, @@ -6590,6 +6624,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Poipole ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPoipoleLevelUpLearnset, .teachableLearnset = sPoipoleTeachableLearnset, .evolutions = EVOLUTION({EVO_MOVE, MOVE_DRAGON_PULSE, SPECIES_NAGANADEL}), @@ -6652,6 +6687,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Naganadel ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNaganadelLevelUpLearnset, .teachableLearnset = sNaganadelTeachableLearnset, }, @@ -6715,6 +6751,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Stakataka ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sStakatakaLevelUpLearnset, .teachableLearnset = sStakatakaTeachableLearnset, }, @@ -6778,6 +6815,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Blacephalon ) .isUltraBeast = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sBlacephalonLevelUpLearnset, .teachableLearnset = sBlacephalonTeachableLearnset, }, @@ -6841,6 +6879,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZeraoraLevelUpLearnset, .teachableLearnset = sZeraoraTeachableLearnset, }, @@ -6904,6 +6943,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMeltanLevelUpLearnset, .teachableLearnset = sMeltanTeachableLearnset, }, @@ -6965,6 +7005,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMelmetalLevelUpLearnset, .teachableLearnset = sMelmetalTeachableLearnset, .formSpeciesIdTable = sMelmetalFormSpeciesIdTable, @@ -7023,6 +7064,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .isMythical = TRUE, .isGigantamax = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMelmetalLevelUpLearnset, .teachableLearnset = sMelmetalTeachableLearnset, .formSpeciesIdTable = sMelmetalFormSpeciesIdTable, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 353597e96a..b4c268f2ab 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -6261,6 +6261,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZacianLevelUpLearnset, .teachableLearnset = sZacianTeachableLearnset, .formSpeciesIdTable = sZacianFormSpeciesIdTable, @@ -6325,6 +6326,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZacianLevelUpLearnset, .teachableLearnset = sZacianTeachableLearnset, .formSpeciesIdTable = sZacianFormSpeciesIdTable, @@ -6391,6 +6393,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZamazentaLevelUpLearnset, .teachableLearnset = sZamazentaTeachableLearnset, .formSpeciesIdTable = sZamazentaFormSpeciesIdTable, @@ -6455,6 +6458,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZamazentaLevelUpLearnset, .teachableLearnset = sZamazentaTeachableLearnset, .formSpeciesIdTable = sZamazentaFormSpeciesIdTable, @@ -6522,6 +6526,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEternatusLevelUpLearnset, .teachableLearnset = sEternatusTeachableLearnset, .formSpeciesIdTable = sEternatusFormSpeciesIdTable, @@ -6578,6 +6583,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = FOOTPRINT(Eternatus) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEternatusLevelUpLearnset, .teachableLearnset = sEternatusTeachableLearnset, .formSpeciesIdTable = sEternatusFormSpeciesIdTable, @@ -6641,6 +6647,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Kubfu ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKubfuLevelUpLearnset, .teachableLearnset = sKubfuTeachableLearnset, .evolutions = EVOLUTION({EVO_DARK_SCROLL, 0, SPECIES_URSHIFU_SINGLE_STRIKE_STYLE}, @@ -6706,6 +6713,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Urshifu ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuSingleStrikeStyleLevelUpLearnset, .teachableLearnset = sUrshifuSingleStrikeStyleTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, @@ -6763,6 +6771,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = FOOTPRINT(Urshifu) .isLegendary = TRUE, .isGigantamax = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuSingleStrikeStyleLevelUpLearnset, .teachableLearnset = sUrshifuSingleStrikeStyleTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, @@ -6826,6 +6835,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Urshifu ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuRapidStrikeStyleLevelUpLearnset, .teachableLearnset = sUrshifuRapidStrikeStyleTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, @@ -6883,6 +6893,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = FOOTPRINT(Urshifu) .isLegendary = TRUE, .isGigantamax = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuRapidStrikeStyleLevelUpLearnset, .teachableLearnset = sUrshifuRapidStrikeStyleTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, @@ -6950,6 +6961,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZarudeLevelUpLearnset, .teachableLearnset = sZarudeTeachableLearnset, .formSpeciesIdTable = sZarudeFormSpeciesIdTable, @@ -7004,6 +7016,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = FOOTPRINT(Zarude) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZarudeLevelUpLearnset, .teachableLearnset = sZarudeTeachableLearnset, .formSpeciesIdTable = sZarudeFormSpeciesIdTable, @@ -7069,6 +7082,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Regieleki ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegielekiLevelUpLearnset, .teachableLearnset = sRegielekiTeachableLearnset, }, @@ -7133,6 +7147,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Regidrago ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegidragoLevelUpLearnset, .teachableLearnset = sRegidragoTeachableLearnset, }, @@ -7195,6 +7210,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Glastrier ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGlastrierLevelUpLearnset, .teachableLearnset = sGlastrierTeachableLearnset, }, @@ -7258,6 +7274,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gShinyOverworldPalette_Spectrier ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSpectrierLevelUpLearnset, .teachableLearnset = sSpectrierTeachableLearnset, }, @@ -7322,6 +7339,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCalyrexLevelUpLearnset, .teachableLearnset = sCalyrexTeachableLearnset, .formSpeciesIdTable = sCalyrexFormSpeciesIdTable, @@ -7387,6 +7405,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCalyrexIceRiderLevelUpLearnset, .teachableLearnset = sCalyrexIceRiderTeachableLearnset, .formSpeciesIdTable = sCalyrexFormSpeciesIdTable, @@ -7451,6 +7470,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCalyrexShadowRiderLevelUpLearnset, .teachableLearnset = sCalyrexShadowRiderTeachableLearnset, .formSpeciesIdTable = sCalyrexFormSpeciesIdTable, @@ -7517,6 +7537,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = //, gShinyOverworldPalette_EnamorusIncarnate ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, .formSpeciesIdTable = sEnamorusFormSpeciesIdTable, @@ -7579,6 +7600,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = //, gShinyOverworldPalette_EnamorusTherian ) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, .formSpeciesIdTable = sEnamorusFormSpeciesIdTable, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 8880d3584d..5a8452af25 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -5436,6 +5436,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, FOOTPRINT(WoChien) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sWoChienLevelUpLearnset, .teachableLearnset = sWoChienTeachableLearnset, }, @@ -5491,6 +5492,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 0, FOOTPRINT(ChienPao) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sChienPaoLevelUpLearnset, .teachableLearnset = sChienPaoTeachableLearnset, }, @@ -5546,6 +5548,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 0, FOOTPRINT(TingLu) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTingLuLevelUpLearnset, .teachableLearnset = sTingLuTeachableLearnset, }, @@ -5602,6 +5605,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 0, FOOTPRINT(ChiYu) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sChiYuLevelUpLearnset, .teachableLearnset = sChiYuTeachableLearnset, }, @@ -5770,6 +5774,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = FOOTPRINT(Koraidon) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKoraidonLevelUpLearnset, .teachableLearnset = sKoraidonTeachableLearnset, }, @@ -5826,6 +5831,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = FOOTPRINT(Miraidon) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMiraidonLevelUpLearnset, .teachableLearnset = sMiraidonTeachableLearnset, }, @@ -6205,6 +6211,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, FOOTPRINT(Okidogi) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sOkidogiLevelUpLearnset, .teachableLearnset = sOkidogiTeachableLearnset, }, @@ -6260,6 +6267,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 0, FOOTPRINT(Munkidori) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMunkidoriLevelUpLearnset, .teachableLearnset = sMunkidoriTeachableLearnset, }, @@ -6315,6 +6323,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 0, FOOTPRINT(Fezandipiti) .isLegendary = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sFezandipitiLevelUpLearnset, .teachableLearnset = sFezandipitiTeachableLearnset, }, @@ -6372,6 +6381,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .formChangeTable = sOgerponFormChangeTable, \ .isLegendary = TRUE, \ .isTeraForm = isTeraform, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } [SPECIES_OGERPON_TEAL_MASK] = OGERPON_SPECIES_INFO(Teal, Mask, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, FALSE), @@ -6663,6 +6673,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = FOOTPRINT(TerapagosNormal) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerapagosLevelUpLearnset, .teachableLearnset = sTerapagosTeachableLearnset, .formSpeciesIdTable = sTerapagosFormSpeciesIdTable, @@ -6722,6 +6733,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = FOOTPRINT(TerapagosTerastal) .isLegendary = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerapagosLevelUpLearnset, .teachableLearnset = sTerapagosTeachableLearnset, .formSpeciesIdTable = sTerapagosFormSpeciesIdTable, @@ -6780,6 +6792,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .isLegendary = TRUE, .isTeraForm = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerapagosLevelUpLearnset, .teachableLearnset = sTerapagosTeachableLearnset, .formSpeciesIdTable = sTerapagosFormSpeciesIdTable, @@ -6838,6 +6851,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = FOOTPRINT(Pecharunt) .isMythical = TRUE, .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPecharuntLevelUpLearnset, .teachableLearnset = sPecharuntTeachableLearnset, }, diff --git a/src/pokemon.c b/src/pokemon.c index 1807b675df..660409d6f6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1109,7 +1109,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u16 checksum; u8 i; u8 availableIVs[NUM_STATS]; - u8 selectedIvs[LEGENDARY_PERFECT_IV_COUNT]; + u8 selectedIvs[NUM_STATS]; bool32 isShiny; ZeroBoxMonData(boxMon); @@ -1226,21 +1226,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, iv = (value & (MAX_IV_MASK << 10)) >> 10; SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); - if (gSpeciesInfo[species].allPerfectIVs) - { - iv = MAX_PER_STAT_IVS; - SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); - } - else if (P_LEGENDARY_PERFECT_IVS >= GEN_6 - && (gSpeciesInfo[species].isLegendary - || gSpeciesInfo[species].isMythical - || gSpeciesInfo[species].isUltraBeast - || gSpeciesInfo[species].isTotem)) + if (gSpeciesInfo[species].perfectIVCount != 0) { iv = MAX_PER_STAT_IVS; // Initialize a list of IV indices. @@ -1249,14 +1235,14 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, availableIVs[i] = i; } - // Select the 3 IVs that will be perfected. - for (i = 0; i < LEGENDARY_PERFECT_IV_COUNT; i++) + // Select the IVs that will be perfected. + for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) { u8 index = Random() % (NUM_STATS - i); selectedIvs[i] = availableIVs[index]; RemoveIVIndexFromList(availableIVs, index); } - for (i = 0; i < LEGENDARY_PERFECT_IV_COUNT; i++) + for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) { switch (selectedIvs[i]) { From a5e07384846f027a0572996e198d8259589d682d Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 8 Aug 2024 19:12:18 +0100 Subject: [PATCH 062/225] trainerproc: Parse line markers (#5122) --- Makefile | 2 +- src/data/trainers.h | 34016 ++++++++++++++++++------------------- tools/trainerproc/main.c | 23 +- 3 files changed, 17026 insertions(+), 17015 deletions(-) diff --git a/Makefile b/Makefile index 055bc848b2..6dacf8b1d3 100644 --- a/Makefile +++ b/Makefile @@ -346,7 +346,7 @@ sound/%.bin: sound/%.aif ; $(AIF) $< $@ COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/global.h | tail -n1) ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) -%.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | sed '/#[^p]/d' | $(TRAINERPROC) -o $@ -i $< - +%.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - endif ifeq ($(MODERN),0) diff --git a/src/data/trainers.h b/src/data/trainers.h index 6215baf1c4..0ef947a14b 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -8,554 +8,389 @@ #line 1 "src/data/trainers.party" -#line 11 +#line 76 [TRAINER_NONE] = { -#line 13 +#line 78 .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 14 +#line 79 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 16 +#line 81 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 17 +#line 82 .doubleBattle = FALSE, .partySize = 0, .party = (const struct TrainerMon[]) { }, }, -#line 19 +#line 84 [TRAINER_SAWYER_1] = { -#line 20 +#line 85 .trainerName = _("SAWYER"), -#line 21 +#line 86 .trainerClass = TRAINER_CLASS_HIKER, -#line 22 +#line 87 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 24 +#line 89 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 25 +#line 90 .doubleBattle = FALSE, -#line 26 +#line 91 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 28 +#line 93 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 30 +#line 95 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 29 +#line 94 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 32 +#line 97 [TRAINER_GRUNT_AQUA_HIDEOUT_1] = { -#line 33 +#line 98 .trainerName = _("GRUNT"), -#line 34 +#line 99 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 35 +#line 100 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 37 +#line 102 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 38 +#line 103 .doubleBattle = FALSE, -#line 39 +#line 104 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 41 +#line 106 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 43 +#line 108 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 42 +#line 107 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 45 +#line 110 [TRAINER_GRUNT_AQUA_HIDEOUT_2] = { -#line 46 +#line 111 .trainerName = _("GRUNT"), -#line 47 +#line 112 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 48 +#line 113 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 50 +#line 115 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 51 +#line 116 .doubleBattle = FALSE, -#line 52 +#line 117 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 54 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 56 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 55 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 58 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 60 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 59 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 62 - [TRAINER_GRUNT_AQUA_HIDEOUT_3] = - { -#line 63 - .trainerName = _("GRUNT"), -#line 64 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 65 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 67 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 68 - .doubleBattle = FALSE, -#line 69 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 71 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 73 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 72 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 75 - [TRAINER_GRUNT_AQUA_HIDEOUT_4] = - { -#line 76 - .trainerName = _("GRUNT"), -#line 77 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 78 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 80 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 81 - .doubleBattle = FALSE, -#line 82 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 84 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 86 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 85 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 88 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = - { -#line 89 - .trainerName = _("GRUNT"), -#line 90 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 91 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 93 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 94 - .doubleBattle = FALSE, -#line 95 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 97 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 99 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 98 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 101 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = - { -#line 102 - .trainerName = _("GRUNT"), -#line 103 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 104 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 106 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 107 - .doubleBattle = FALSE, -#line 108 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 110 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 112 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 111 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 114 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = - { -#line 115 - .trainerName = _("GRUNT"), -#line 116 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 117 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = #line 119 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 120 - .doubleBattle = FALSE, + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, #line 121 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 120 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 123 - .species = SPECIES_ZUBAT, + .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, #line 125 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 124 - .lvl = 36, + .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 127 - [TRAINER_GABRIELLE_1] = + [TRAINER_GRUNT_AQUA_HIDEOUT_3] = { #line 128 - .trainerName = _("GABRIELLE"), + .trainerName = _("GRUNT"), #line 129 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 130 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 131 -F_TRAINER_FEMALE | #line 132 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_AQUA, #line 133 .doubleBattle = FALSE, #line 134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 136 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 138 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 137 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 140 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 142 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 141 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 144 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 146 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 145 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 148 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 150 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 149 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 152 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 154 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 153 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 156 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 158 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 157 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 160 - [TRAINER_GRUNT_PETALBURG_WOODS] = - { -#line 161 - .trainerName = _("GRUNT"), -#line 162 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 163 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 165 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 166 - .doubleBattle = FALSE, -#line 167 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 169 +#line 136 + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 138 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 137 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 140 + [TRAINER_GRUNT_AQUA_HIDEOUT_4] = + { +#line 141 + .trainerName = _("GRUNT"), +#line 142 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 143 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .encounterMusic_gender = +#line 145 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 146 + .doubleBattle = FALSE, +#line 147 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 149 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 151 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 150 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 153 + [TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = + { +#line 154 + .trainerName = _("GRUNT"), +#line 155 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 156 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .encounterMusic_gender = +#line 158 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 159 + .doubleBattle = FALSE, +#line 160 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 162 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 171 +#line 164 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 170 - .lvl = 9, +#line 163 + .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 173 - [TRAINER_MARCEL] = +#line 166 + [TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = { -#line 174 - .trainerName = _("MARCEL"), -#line 175 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 176 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, +#line 167 + .trainerName = _("GRUNT"), +#line 168 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 169 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 178 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 179 - .items = { ITEM_HYPER_POTION }, -#line 180 +#line 171 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 172 .doubleBattle = FALSE, -#line 181 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, +#line 173 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 183 - .species = SPECIES_MANECTRIC, +#line 175 + .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 185 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 184 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 187 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 189 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 188 - .lvl = 29, +#line 177 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 176 + .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 191 - [TRAINER_ALBERTO] = +#line 179 + [TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = { +#line 180 + .trainerName = _("GRUNT"), +#line 181 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 182 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .encounterMusic_gender = +#line 184 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 185 + .doubleBattle = FALSE, +#line 186 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 188 + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 190 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 189 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 192 - .trainerName = _("ALBERTO"), + [TRAINER_GABRIELLE_1] = + { #line 193 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .trainerName = _("GABRIELLE"), #line 194 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, +#line 195 + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = #line 196 - TRAINER_ENCOUNTER_MUSIC_COOL, +F_TRAINER_FEMALE | #line 197 - .doubleBattle = FALSE, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 198 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 200 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 202 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 201 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 204 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 206 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 205 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 208 - [TRAINER_ED] = - { -#line 209 - .trainerName = _("ED"), -#line 210 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 211 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 213 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 214 .doubleBattle = FALSE, -#line 215 +#line 199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .partySize = 6, .party = (const struct TrainerMon[]) { { +#line 201 + .species = SPECIES_SKITTY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 203 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 202 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 205 + .species = SPECIES_POOCHYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 207 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 206 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 209 + .species = SPECIES_ZIGZAGOON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 211 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 210 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 213 + .species = SPECIES_LOTAD, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 215 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 214 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 217 - .species = SPECIES_ZANGOOSE, + .species = SPECIES_SEEDOT, .gender = TRAINER_MON_RANDOM_GENDER, #line 219 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 218 - .lvl = 30, + .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 221 - .species = SPECIES_SEVIPER, + .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, #line 223 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 222 - .lvl = 30, + .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 225 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = + [TRAINER_GRUNT_PETALBURG_WOODS] = { #line 226 .trainerName = _("GRUNT"), #line 227 .trainerClass = TRAINER_CLASS_TEAM_AQUA, #line 228 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 229 -F_TRAINER_FEMALE | #line 230 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 231 @@ -567,716 +402,714 @@ F_TRAINER_FEMALE | { { #line 234 - .species = SPECIES_CARVANHA, + .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 236 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 235 - .lvl = 36, + .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 238 - [TRAINER_DECLAN] = + [TRAINER_MARCEL] = { #line 239 - .trainerName = _("DECLAN"), + .trainerName = _("MARCEL"), #line 240 - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 241 - .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = #line 243 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, + TRAINER_ENCOUNTER_MUSIC_COOL, #line 244 - .doubleBattle = FALSE, + .items = { ITEM_HYPER_POTION }, #line 245 + .doubleBattle = FALSE, +#line 246 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 248 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 250 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 249 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 252 + .species = SPECIES_SHIFTRY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 254 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 253 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 256 + [TRAINER_ALBERTO] = + { +#line 257 + .trainerName = _("ALBERTO"), +#line 258 + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, +#line 259 + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .encounterMusic_gender = +#line 261 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 262 + .doubleBattle = FALSE, +#line 263 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 265 + .species = SPECIES_PELIPPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 267 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 266 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 269 + .species = SPECIES_XATU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 271 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 270 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 273 + [TRAINER_ED] = + { +#line 274 + .trainerName = _("ED"), +#line 275 + .trainerClass = TRAINER_CLASS_COLLECTOR, +#line 276 + .trainerPic = TRAINER_PIC_COLLECTOR, + .encounterMusic_gender = +#line 278 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 279 + .doubleBattle = FALSE, +#line 280 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 282 + .species = SPECIES_ZANGOOSE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 284 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 283 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 286 + .species = SPECIES_SEVIPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 288 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 287 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 290 + [TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = + { +#line 291 + .trainerName = _("GRUNT"), +#line 292 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 293 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .encounterMusic_gender = +#line 294 +F_TRAINER_FEMALE | +#line 295 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 296 + .doubleBattle = FALSE, +#line 297 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 247 +#line 299 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 301 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 300 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 303 + [TRAINER_DECLAN] = + { +#line 304 + .trainerName = _("DECLAN"), +#line 305 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 306 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 308 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 309 + .doubleBattle = FALSE, +#line 310 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 312 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 249 +#line 314 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 248 +#line 313 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 251 +#line 316 [TRAINER_GRUNT_RUSTURF_TUNNEL] = { -#line 252 +#line 317 .trainerName = _("GRUNT"), -#line 253 +#line 318 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 254 +#line 319 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 256 +#line 321 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 257 +#line 322 .doubleBattle = FALSE, -#line 258 +#line 323 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 260 +#line 325 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 262 +#line 327 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 261 +#line 326 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 264 +#line 329 [TRAINER_GRUNT_WEATHER_INST_1] = { -#line 265 +#line 330 .trainerName = _("GRUNT"), -#line 266 +#line 331 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 267 +#line 332 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 269 +#line 334 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 270 +#line 335 .doubleBattle = FALSE, -#line 271 +#line 336 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 273 +#line 338 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 275 +#line 340 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 274 +#line 339 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 277 +#line 342 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 279 +#line 344 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 278 +#line 343 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 281 +#line 346 [TRAINER_GRUNT_WEATHER_INST_2] = { -#line 282 +#line 347 .trainerName = _("GRUNT"), -#line 283 +#line 348 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 284 +#line 349 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 286 +#line 351 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 287 +#line 352 .doubleBattle = FALSE, -#line 288 +#line 353 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 290 +#line 355 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 292 +#line 357 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 291 +#line 356 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 294 +#line 359 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 296 +#line 361 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 295 +#line 360 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 298 +#line 363 [TRAINER_GRUNT_WEATHER_INST_3] = { -#line 299 +#line 364 .trainerName = _("GRUNT"), -#line 300 +#line 365 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 301 +#line 366 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 303 +#line 368 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 304 +#line 369 .doubleBattle = FALSE, -#line 305 +#line 370 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 307 +#line 372 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 309 +#line 374 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 308 +#line 373 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 311 +#line 376 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 313 +#line 378 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 312 +#line 377 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 315 +#line 380 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 317 +#line 382 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 316 +#line 381 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 319 +#line 384 [TRAINER_GRUNT_MUSEUM_1] = { -#line 320 +#line 385 .trainerName = _("GRUNT"), -#line 321 +#line 386 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 322 +#line 387 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 324 +#line 389 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 325 +#line 390 .doubleBattle = FALSE, -#line 326 +#line 391 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 328 +#line 393 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 330 +#line 395 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 329 +#line 394 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 332 +#line 397 [TRAINER_GRUNT_MUSEUM_2] = { -#line 333 +#line 398 .trainerName = _("GRUNT"), -#line 334 +#line 399 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 335 +#line 400 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 337 +#line 402 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 338 +#line 403 .doubleBattle = FALSE, -#line 339 +#line 404 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 341 +#line 406 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 343 +#line 408 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 342 +#line 407 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 345 +#line 410 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 347 +#line 412 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 346 +#line 411 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 349 +#line 414 [TRAINER_GRUNT_SPACE_CENTER_1] = { -#line 350 +#line 415 .trainerName = _("GRUNT"), -#line 351 +#line 416 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 352 +#line 417 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 354 +#line 419 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 355 +#line 420 .doubleBattle = FALSE, -#line 356 +#line 421 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 358 +#line 423 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 360 +#line 425 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 359 +#line 424 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 362 +#line 427 [TRAINER_GRUNT_MT_PYRE_1] = { -#line 363 +#line 428 .trainerName = _("GRUNT"), -#line 364 +#line 429 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 365 +#line 430 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 367 +#line 432 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 368 +#line 433 .doubleBattle = FALSE, -#line 369 +#line 434 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 371 +#line 436 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 373 +#line 438 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 372 +#line 437 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 375 +#line 440 [TRAINER_GRUNT_MT_PYRE_2] = { -#line 376 +#line 441 .trainerName = _("GRUNT"), -#line 377 +#line 442 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 378 +#line 443 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 380 +#line 445 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 381 +#line 446 .doubleBattle = FALSE, -#line 382 +#line 447 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 384 +#line 449 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 386 +#line 451 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 385 +#line 450 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 388 +#line 453 [TRAINER_GRUNT_MT_PYRE_3] = { -#line 389 +#line 454 .trainerName = _("GRUNT"), -#line 390 +#line 455 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 391 +#line 456 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 393 +#line 458 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 394 +#line 459 .doubleBattle = FALSE, -#line 395 +#line 460 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 397 +#line 462 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 399 +#line 464 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 398 +#line 463 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 401 +#line 466 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 403 +#line 468 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 402 +#line 467 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 405 +#line 470 [TRAINER_GRUNT_WEATHER_INST_4] = { -#line 406 +#line 471 .trainerName = _("GRUNT"), -#line 407 +#line 472 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 408 +#line 473 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 409 +#line 474 F_TRAINER_FEMALE | -#line 410 +#line 475 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 411 +#line 476 .doubleBattle = FALSE, -#line 412 +#line 477 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 414 +#line 479 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 416 +#line 481 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 415 +#line 480 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 418 +#line 483 [TRAINER_GRUNT_AQUA_HIDEOUT_5] = { -#line 419 +#line 484 .trainerName = _("GRUNT"), -#line 420 +#line 485 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 421 +#line 486 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 422 +#line 487 F_TRAINER_FEMALE | -#line 423 +#line 488 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 424 +#line 489 .doubleBattle = FALSE, -#line 425 +#line 490 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 427 +#line 492 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 429 +#line 494 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 428 +#line 493 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 431 +#line 496 [TRAINER_GRUNT_AQUA_HIDEOUT_6] = { -#line 432 +#line 497 .trainerName = _("GRUNT"), -#line 433 +#line 498 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 434 +#line 499 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 435 +#line 500 F_TRAINER_FEMALE | -#line 436 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 437 - .doubleBattle = FALSE, -#line 438 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 440 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 442 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 441 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 444 - [TRAINER_FREDRICK] = - { -#line 445 - .trainerName = _("FREDRICK"), -#line 446 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 447 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 449 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 450 - .doubleBattle = FALSE, -#line 451 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 453 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 455 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 454 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 457 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 459 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 458 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 461 - [TRAINER_MATT] = - { -#line 462 - .trainerName = _("MATT"), -#line 463 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 464 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, - .encounterMusic_gender = -#line 466 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 467 - .items = { ITEM_SUPER_POTION }, -#line 468 - .doubleBattle = FALSE, -#line 469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 471 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 473 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 472 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 475 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 477 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 476 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 479 - [TRAINER_ZANDER] = - { -#line 480 - .trainerName = _("ZANDER"), -#line 481 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 482 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 484 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 485 - .doubleBattle = FALSE, -#line 486 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 488 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 490 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 489 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 492 - [TRAINER_SHELLY_WEATHER_INSTITUTE] = - { -#line 493 - .trainerName = _("SHELLY"), -#line 494 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 495 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = -#line 496 -F_TRAINER_FEMALE | -#line 497 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 498 - .doubleBattle = FALSE, -#line 499 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { #line 501 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 503 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), + TRAINER_ENCOUNTER_MUSIC_AQUA, #line 502 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, + .doubleBattle = FALSE, +#line 503 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { { #line 505 - .species = SPECIES_MIGHTYENA, + .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, #line 507 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 506 - .lvl = 28, + .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 509 - [TRAINER_SHELLY_SEAFLOOR_CAVERN] = + [TRAINER_FREDRICK] = { #line 510 - .trainerName = _("SHELLY"), + .trainerName = _("FREDRICK"), #line 511 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, + .trainerClass = TRAINER_CLASS_EXPERT, #line 512 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, + .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 513 -F_TRAINER_FEMALE | #line 514 - TRAINER_ENCOUNTER_MUSIC_AQUA, + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 515 .doubleBattle = FALSE, #line 516 @@ -1286,47 +1119,47 @@ F_TRAINER_FEMALE | { { #line 518 - .species = SPECIES_SHARPEDO, + .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, #line 520 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), #line 519 - .lvl = 37, + .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 522 - .species = SPECIES_MIGHTYENA, + .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, #line 524 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), #line 523 - .lvl = 37, + .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 526 - [TRAINER_ARCHIE] = + [TRAINER_MATT] = { #line 527 - .trainerName = _("ARCHIE"), + .trainerName = _("MATT"), #line 528 - .trainerClass = TRAINER_CLASS_AQUA_LEADER, + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, #line 529 - .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, + .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, .encounterMusic_gender = #line 531 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 532 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, + .items = { ITEM_SUPER_POTION }, #line 533 .doubleBattle = FALSE, #line 534 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, + .partySize = 2, .party = (const struct TrainerMon[]) { { @@ -1334,514 +1167,681 @@ F_TRAINER_FEMALE | .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 538 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), #line 537 - .lvl = 41, + .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 540 - .species = SPECIES_CROBAT, + .species = SPECIES_GOLBAT, .gender = TRAINER_MON_RANDOM_GENDER, #line 542 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), #line 541 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 544 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 546 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 545 - .lvl = 43, + .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 548 - [TRAINER_LEAH] = +#line 544 + [TRAINER_ZANDER] = { -#line 549 - .trainerName = _("LEAH"), -#line 550 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 551 - .trainerPic = TRAINER_PIC_HEX_MANIAC, +#line 545 + .trainerName = _("ZANDER"), +#line 546 + .trainerClass = TRAINER_CLASS_BLACK_BELT, +#line 547 + .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 552 -F_TRAINER_FEMALE | -#line 553 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 554 +#line 549 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 550 .doubleBattle = FALSE, -#line 555 +#line 551 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 557 - .species = SPECIES_SPOINK, +#line 553 + .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 559 +#line 555 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 558 +#line 554 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, +#line 557 + [TRAINER_SHELLY_WEATHER_INSTITUTE] = + { +#line 558 + .trainerName = _("SHELLY"), +#line 559 + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, +#line 560 + .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, + .encounterMusic_gender = #line 561 - [TRAINER_DAISY] = - { +F_TRAINER_FEMALE | #line 562 - .trainerName = _("DAISY"), + TRAINER_ENCOUNTER_MUSIC_AQUA, #line 563 - .trainerClass = TRAINER_CLASS_AROMA_LADY, + .doubleBattle = FALSE, #line 564 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 565 -F_TRAINER_FEMALE | -#line 566 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 567 - .doubleBattle = FALSE, -#line 568 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 570 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 572 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 571 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 574 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 576 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 575 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 578 - [TRAINER_ROSE_1] = - { -#line 579 - .trainerName = _("ROSE"), -#line 580 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 581 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 582 -F_TRAINER_FEMALE | -#line 583 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 584 - .doubleBattle = FALSE, -#line 585 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 587 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 589 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 588 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 591 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 593 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 592 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 595 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 597 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 596 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 599 - [TRAINER_FELIX] = - { -#line 600 - .trainerName = _("FELIX"), -#line 601 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 602 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 604 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 605 - .items = { ITEM_FULL_RESTORE }, -#line 606 - .doubleBattle = FALSE, -#line 607 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { +#line 566 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 568 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 567 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 570 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 572 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 571 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 574 + [TRAINER_SHELLY_SEAFLOOR_CAVERN] = + { +#line 575 + .trainerName = _("SHELLY"), +#line 576 + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, +#line 577 + .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, + .encounterMusic_gender = +#line 578 +F_TRAINER_FEMALE | +#line 579 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 580 + .doubleBattle = FALSE, +#line 581 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 583 + .species = SPECIES_SHARPEDO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 585 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 584 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 587 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 589 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 588 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 591 + [TRAINER_ARCHIE] = + { +#line 592 + .trainerName = _("ARCHIE"), +#line 593 + .trainerClass = TRAINER_CLASS_AQUA_LEADER, +#line 594 + .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, + .encounterMusic_gender = +#line 596 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 597 + .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, +#line 598 + .doubleBattle = FALSE, +#line 599 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 601 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 603 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 602 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 605 + .species = SPECIES_CROBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 607 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 606 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 609 - .species = SPECIES_MEDICHAM, + .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, #line 611 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), #line 610 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 612 - MOVE_PSYCHIC, }, + }, + }, +#line 613 + [TRAINER_LEAH] = + { +#line 614 + .trainerName = _("LEAH"), +#line 615 + .trainerClass = TRAINER_CLASS_HEX_MANIAC, +#line 616 + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .encounterMusic_gender = +#line 617 +F_TRAINER_FEMALE | +#line 618 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 619 + .doubleBattle = FALSE, +#line 620 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 622 + .species = SPECIES_SPOINK, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 624 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 623 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 626 + [TRAINER_DAISY] = + { +#line 627 + .trainerName = _("DAISY"), +#line 628 + .trainerClass = TRAINER_CLASS_AROMA_LADY, +#line 629 + .trainerPic = TRAINER_PIC_AROMA_LADY, + .encounterMusic_gender = +#line 630 +F_TRAINER_FEMALE | +#line 631 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 632 + .doubleBattle = FALSE, +#line 633 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 635 + .species = SPECIES_SHROOMISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 637 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 636 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 614 - .species = SPECIES_CLAYDOL, +#line 639 + .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 616 +#line 641 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 615 +#line 640 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 643 + [TRAINER_ROSE_1] = + { +#line 644 + .trainerName = _("ROSE"), +#line 645 + .trainerClass = TRAINER_CLASS_AROMA_LADY, +#line 646 + .trainerPic = TRAINER_PIC_AROMA_LADY, + .encounterMusic_gender = +#line 647 +F_TRAINER_FEMALE | +#line 648 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 649 + .doubleBattle = FALSE, +#line 650 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 652 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 654 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 653 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 656 + .species = SPECIES_SHROOMISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 658 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 657 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 660 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 662 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 661 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 664 + [TRAINER_FELIX] = + { +#line 665 + .trainerName = _("FELIX"), +#line 666 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 667 + .trainerPic = TRAINER_PIC_COOLTRAINER_M, + .encounterMusic_gender = +#line 669 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 670 + .items = { ITEM_FULL_RESTORE }, +#line 671 + .doubleBattle = FALSE, +#line 672 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 674 + .species = SPECIES_MEDICHAM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 676 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 675 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 617 +#line 677 + MOVE_PSYCHIC, + }, + }, + { +#line 679 + .species = SPECIES_CLAYDOL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 681 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 680 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 682 MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, }, }, }, }, -#line 620 +#line 685 [TRAINER_VIOLET] = { -#line 621 +#line 686 .trainerName = _("VIOLET"), -#line 622 +#line 687 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 623 +#line 688 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 624 +#line 689 F_TRAINER_FEMALE | -#line 625 +#line 690 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 626 +#line 691 .doubleBattle = FALSE, -#line 627 +#line 692 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 629 +#line 694 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 631 +#line 696 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 630 +#line 695 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 633 +#line 698 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 635 +#line 700 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 634 +#line 699 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 637 +#line 702 [TRAINER_ROSE_2] = { -#line 638 +#line 703 .trainerName = _("ROSE"), -#line 639 +#line 704 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 640 +#line 705 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 641 +#line 706 F_TRAINER_FEMALE | -#line 642 +#line 707 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 643 +#line 708 .doubleBattle = FALSE, -#line 644 +#line 709 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 646 +#line 711 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 648 +#line 713 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 647 +#line 712 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 650 +#line 715 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 652 +#line 717 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 651 +#line 716 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 654 +#line 719 [TRAINER_ROSE_3] = { -#line 655 +#line 720 .trainerName = _("ROSE"), -#line 656 +#line 721 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 657 +#line 722 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 658 +#line 723 F_TRAINER_FEMALE | -#line 659 +#line 724 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 660 +#line 725 .doubleBattle = FALSE, -#line 661 +#line 726 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 663 +#line 728 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 665 +#line 730 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 664 +#line 729 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 667 +#line 732 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 669 +#line 734 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 668 +#line 733 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 671 +#line 736 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 673 +#line 738 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 672 +#line 737 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 675 +#line 740 [TRAINER_ROSE_4] = { -#line 676 +#line 741 .trainerName = _("ROSE"), -#line 677 +#line 742 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 678 +#line 743 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 679 +#line 744 F_TRAINER_FEMALE | -#line 680 +#line 745 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 681 +#line 746 .doubleBattle = FALSE, -#line 682 +#line 747 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 684 +#line 749 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 686 +#line 751 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 685 +#line 750 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 688 +#line 753 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 690 +#line 755 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 689 +#line 754 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 692 +#line 757 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 694 +#line 759 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 693 +#line 758 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 696 +#line 761 [TRAINER_ROSE_5] = { -#line 697 +#line 762 .trainerName = _("ROSE"), -#line 698 +#line 763 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 699 +#line 764 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 700 +#line 765 F_TRAINER_FEMALE | -#line 701 +#line 766 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 702 +#line 767 .doubleBattle = FALSE, -#line 703 +#line 768 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 705 +#line 770 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 707 +#line 772 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 706 +#line 771 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 709 +#line 774 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 711 +#line 776 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 710 +#line 775 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 713 +#line 778 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 715 +#line 780 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 714 +#line 779 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 717 +#line 782 [TRAINER_DUSTY_1] = { -#line 718 +#line 783 .trainerName = _("DUSTY"), -#line 719 +#line 784 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 720 +#line 785 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 722 +#line 787 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 723 +#line 788 .doubleBattle = FALSE, -#line 724 +#line 789 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 726 +#line 791 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 728 +#line 793 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 727 +#line 792 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 729 +#line 794 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -1850,37 +1850,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 734 +#line 799 [TRAINER_CHIP] = { -#line 735 +#line 800 .trainerName = _("CHIP"), -#line 736 +#line 801 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 737 +#line 802 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 739 +#line 804 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 740 +#line 805 .doubleBattle = FALSE, -#line 741 +#line 806 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 743 +#line 808 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 745 +#line 810 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 744 +#line 809 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 746 +#line 811 MOVE_PSYBEAM, MOVE_SELF_DESTRUCT, MOVE_SANDSTORM, @@ -1888,17 +1888,17 @@ F_TRAINER_FEMALE | }, }, { -#line 751 +#line 816 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 753 +#line 818 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 752 +#line 817 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 754 +#line 819 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -1906,17 +1906,17 @@ F_TRAINER_FEMALE | }, }, { -#line 759 +#line 824 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 761 +#line 826 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 760 +#line 825 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 762 +#line 827 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -1925,37 +1925,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 767 +#line 832 [TRAINER_FOSTER] = { -#line 768 +#line 833 .trainerName = _("FOSTER"), -#line 769 +#line 834 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 770 +#line 835 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 772 +#line 837 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 773 +#line 838 .doubleBattle = FALSE, -#line 774 +#line 839 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 776 +#line 841 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 778 +#line 843 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 777 +#line 842 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 779 +#line 844 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -1963,17 +1963,17 @@ F_TRAINER_FEMALE | }, }, { -#line 784 +#line 849 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 786 +#line 851 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 785 +#line 850 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 787 +#line 852 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -1982,37 +1982,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 792 +#line 857 [TRAINER_DUSTY_2] = { -#line 793 +#line 858 .trainerName = _("DUSTY"), -#line 794 +#line 859 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 795 +#line 860 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 797 +#line 862 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 798 +#line 863 .doubleBattle = FALSE, -#line 799 +#line 864 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 801 +#line 866 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 803 +#line 868 .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 802 +#line 867 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 804 +#line 869 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -2021,37 +2021,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 809 +#line 874 [TRAINER_DUSTY_3] = { -#line 810 +#line 875 .trainerName = _("DUSTY"), -#line 811 +#line 876 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 812 +#line 877 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 814 +#line 879 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 815 +#line 880 .doubleBattle = FALSE, -#line 816 +#line 881 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 818 +#line 883 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 820 +#line 885 .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 819 +#line 884 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 821 +#line 886 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -2060,37 +2060,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 826 +#line 891 [TRAINER_DUSTY_4] = { -#line 827 +#line 892 .trainerName = _("DUSTY"), -#line 828 +#line 893 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 829 +#line 894 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 831 +#line 896 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 832 +#line 897 .doubleBattle = FALSE, -#line 833 +#line 898 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 835 +#line 900 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 837 +#line 902 .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 836 +#line 901 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 838 +#line 903 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -2099,37 +2099,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 843 +#line 908 [TRAINER_DUSTY_5] = { -#line 844 +#line 909 .trainerName = _("DUSTY"), -#line 845 +#line 910 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 846 +#line 911 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 848 +#line 913 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 849 +#line 914 .doubleBattle = FALSE, -#line 850 +#line 915 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 852 +#line 917 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 854 +#line 919 .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 853 +#line 918 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 855 +#line 920 MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, @@ -2138,252 +2138,252 @@ F_TRAINER_FEMALE | }, }, }, -#line 860 +#line 925 [TRAINER_GABBY_AND_TY_1] = { -#line 861 +#line 926 .trainerName = _("GABBY & TY"), -#line 862 +#line 927 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 863 +#line 928 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 865 +#line 930 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 866 +#line 931 .doubleBattle = TRUE, -#line 867 +#line 932 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 869 +#line 934 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 871 +#line 936 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 870 +#line 935 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 873 +#line 938 .species = SPECIES_WHISMUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 875 +#line 940 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 874 +#line 939 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 877 +#line 942 [TRAINER_GABBY_AND_TY_2] = { -#line 878 +#line 943 .trainerName = _("GABBY & TY"), -#line 879 +#line 944 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 880 +#line 945 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 882 +#line 947 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 883 +#line 948 .doubleBattle = TRUE, -#line 884 +#line 949 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 886 +#line 951 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 888 +#line 953 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 887 +#line 952 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 890 +#line 955 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 892 +#line 957 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 891 +#line 956 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 894 +#line 959 [TRAINER_GABBY_AND_TY_3] = { -#line 895 +#line 960 .trainerName = _("GABBY & TY"), -#line 896 +#line 961 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 897 +#line 962 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 899 +#line 964 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 900 +#line 965 .doubleBattle = TRUE, -#line 901 +#line 966 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 903 +#line 968 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 905 +#line 970 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 904 +#line 969 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 907 +#line 972 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 909 +#line 974 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 908 +#line 973 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 911 +#line 976 [TRAINER_GABBY_AND_TY_4] = { -#line 912 +#line 977 .trainerName = _("GABBY & TY"), -#line 913 +#line 978 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 914 +#line 979 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 916 +#line 981 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 917 +#line 982 .doubleBattle = TRUE, -#line 918 +#line 983 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 920 +#line 985 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 922 +#line 987 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 921 +#line 986 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 924 +#line 989 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 926 +#line 991 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 925 +#line 990 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 928 +#line 993 [TRAINER_GABBY_AND_TY_5] = { -#line 929 +#line 994 .trainerName = _("GABBY & TY"), -#line 930 +#line 995 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 931 +#line 996 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 933 +#line 998 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 934 +#line 999 .doubleBattle = TRUE, -#line 935 +#line 1000 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 937 +#line 1002 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 939 +#line 1004 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 938 +#line 1003 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 941 +#line 1006 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 943 +#line 1008 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 942 +#line 1007 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 945 +#line 1010 [TRAINER_GABBY_AND_TY_6] = { -#line 946 +#line 1011 .trainerName = _("GABBY & TY"), -#line 947 +#line 1012 .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 948 +#line 1013 .trainerPic = TRAINER_PIC_INTERVIEWER, .encounterMusic_gender = -#line 950 +#line 1015 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 951 +#line 1016 .doubleBattle = TRUE, -#line 952 +#line 1017 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 954 +#line 1019 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 956 +#line 1021 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 955 +#line 1020 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 957 +#line 1022 MOVE_SONIC_BOOM, MOVE_THUNDER_WAVE, MOVE_METAL_SOUND, @@ -2391,17 +2391,17 @@ F_TRAINER_FEMALE | }, }, { -#line 962 +#line 1027 .species = SPECIES_EXPLOUD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 964 +#line 1029 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 963 +#line 1028 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 965 +#line 1030 MOVE_ASTONISH, MOVE_STOMP, MOVE_SUPERSONIC, @@ -2410,330 +2410,330 @@ F_TRAINER_FEMALE | }, }, }, -#line 970 +#line 1035 [TRAINER_LOLA_1] = { -#line 971 +#line 1036 .trainerName = _("LOLA"), -#line 972 +#line 1037 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 973 +#line 1038 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 974 +#line 1039 F_TRAINER_FEMALE | -#line 975 +#line 1040 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 976 +#line 1041 .doubleBattle = FALSE, -#line 977 +#line 1042 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 979 +#line 1044 .species = SPECIES_AZURILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 981 +#line 1046 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 980 +#line 1045 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 983 +#line 1048 .species = SPECIES_AZURILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 985 +#line 1050 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 984 +#line 1049 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 987 +#line 1052 [TRAINER_AUSTINA] = { -#line 988 +#line 1053 .trainerName = _("AUSTINA"), -#line 989 +#line 1054 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 990 +#line 1055 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 991 +#line 1056 F_TRAINER_FEMALE | -#line 992 +#line 1057 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 993 +#line 1058 .doubleBattle = FALSE, -#line 994 +#line 1059 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 996 +#line 1061 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 998 +#line 1063 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 997 +#line 1062 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1000 +#line 1065 [TRAINER_GWEN] = { -#line 1001 +#line 1066 .trainerName = _("GWEN"), -#line 1002 +#line 1067 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1003 +#line 1068 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 1004 +#line 1069 F_TRAINER_FEMALE | -#line 1005 +#line 1070 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1006 +#line 1071 .doubleBattle = FALSE, -#line 1007 +#line 1072 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1009 +#line 1074 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1011 +#line 1076 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1010 +#line 1075 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1013 +#line 1078 [TRAINER_LOLA_2] = { -#line 1014 +#line 1079 .trainerName = _("LOLA"), -#line 1015 +#line 1080 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1016 +#line 1081 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 1017 +#line 1082 F_TRAINER_FEMALE | -#line 1018 +#line 1083 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1019 +#line 1084 .doubleBattle = FALSE, -#line 1020 +#line 1085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1022 +#line 1087 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1024 +#line 1089 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1023 +#line 1088 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1026 +#line 1091 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1028 +#line 1093 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1027 +#line 1092 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1030 +#line 1095 [TRAINER_LOLA_3] = { -#line 1031 +#line 1096 .trainerName = _("LOLA"), -#line 1032 +#line 1097 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1033 +#line 1098 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 1034 +#line 1099 F_TRAINER_FEMALE | -#line 1035 +#line 1100 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1036 +#line 1101 .doubleBattle = FALSE, -#line 1037 +#line 1102 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1039 +#line 1104 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1041 +#line 1106 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1040 +#line 1105 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1043 +#line 1108 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1045 +#line 1110 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1044 +#line 1109 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1047 +#line 1112 [TRAINER_LOLA_4] = { -#line 1048 +#line 1113 .trainerName = _("LOLA"), -#line 1049 +#line 1114 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1050 +#line 1115 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 1051 +#line 1116 F_TRAINER_FEMALE | -#line 1052 +#line 1117 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1053 +#line 1118 .doubleBattle = FALSE, -#line 1054 +#line 1119 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1056 +#line 1121 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1058 +#line 1123 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1057 +#line 1122 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1060 +#line 1125 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1062 +#line 1127 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1061 +#line 1126 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1064 +#line 1129 [TRAINER_LOLA_5] = { -#line 1065 +#line 1130 .trainerName = _("LOLA"), -#line 1066 +#line 1131 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1067 +#line 1132 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 1068 +#line 1133 F_TRAINER_FEMALE | -#line 1069 +#line 1134 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1070 +#line 1135 .doubleBattle = FALSE, -#line 1071 +#line 1136 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1073 +#line 1138 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1075 +#line 1140 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1074 +#line 1139 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1077 +#line 1142 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1079 +#line 1144 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1078 +#line 1143 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1081 +#line 1146 [TRAINER_RICKY_1] = { -#line 1082 +#line 1147 .trainerName = _("RICKY"), -#line 1083 +#line 1148 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1084 +#line 1149 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1086 +#line 1151 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1087 +#line 1152 .doubleBattle = FALSE, -#line 1088 +#line 1153 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1090 +#line 1155 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1092 +#line 1157 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1091 +#line 1156 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1093 +#line 1158 MOVE_SAND_ATTACK, MOVE_HEADBUTT, MOVE_TAIL_WHIP, @@ -2742,112 +2742,112 @@ F_TRAINER_FEMALE | }, }, }, -#line 1098 +#line 1163 [TRAINER_SIMON] = { -#line 1099 +#line 1164 .trainerName = _("SIMON"), -#line 1100 +#line 1165 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1101 +#line 1166 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1103 +#line 1168 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1104 +#line 1169 .doubleBattle = FALSE, -#line 1105 +#line 1170 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1107 +#line 1172 .species = SPECIES_AZURILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1109 +#line 1174 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1108 +#line 1173 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1111 +#line 1176 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1113 +#line 1178 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1112 +#line 1177 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1115 +#line 1180 [TRAINER_CHARLIE] = { -#line 1116 +#line 1181 .trainerName = _("CHARLIE"), -#line 1117 +#line 1182 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1118 +#line 1183 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1120 +#line 1185 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1121 +#line 1186 .doubleBattle = FALSE, -#line 1122 +#line 1187 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1124 +#line 1189 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1126 +#line 1191 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1125 +#line 1190 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1128 +#line 1193 [TRAINER_RICKY_2] = { -#line 1129 +#line 1194 .trainerName = _("RICKY"), -#line 1130 +#line 1195 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1131 +#line 1196 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1133 +#line 1198 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1134 +#line 1199 .doubleBattle = FALSE, -#line 1135 +#line 1200 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1137 +#line 1202 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1139 +#line 1204 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1138 +#line 1203 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1140 +#line 1205 MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, @@ -2856,37 +2856,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 1145 +#line 1210 [TRAINER_RICKY_3] = { -#line 1146 +#line 1211 .trainerName = _("RICKY"), -#line 1147 +#line 1212 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1148 +#line 1213 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1150 +#line 1215 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1151 +#line 1216 .doubleBattle = FALSE, -#line 1152 +#line 1217 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1154 +#line 1219 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1156 +#line 1221 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1155 +#line 1220 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1157 +#line 1222 MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, @@ -2895,37 +2895,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 1162 +#line 1227 [TRAINER_RICKY_4] = { -#line 1163 +#line 1228 .trainerName = _("RICKY"), -#line 1164 +#line 1229 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1165 +#line 1230 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1167 +#line 1232 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1168 +#line 1233 .doubleBattle = FALSE, -#line 1169 +#line 1234 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1171 +#line 1236 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1173 +#line 1238 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1172 +#line 1237 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1174 +#line 1239 MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, @@ -2934,37 +2934,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 1179 +#line 1244 [TRAINER_RICKY_5] = { -#line 1180 +#line 1245 .trainerName = _("RICKY"), -#line 1181 +#line 1246 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1182 +#line 1247 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 1184 +#line 1249 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1185 +#line 1250 .doubleBattle = FALSE, -#line 1186 +#line 1251 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1188 +#line 1253 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1190 +#line 1255 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1189 +#line 1254 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1191 +#line 1256 MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, @@ -2973,39 +2973,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 1196 +#line 1261 [TRAINER_RANDALL] = { -#line 1197 +#line 1262 .trainerName = _("RANDALL"), -#line 1198 +#line 1263 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1199 +#line 1264 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1201 +#line 1266 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1202 +#line 1267 .items = { ITEM_HYPER_POTION }, -#line 1203 +#line 1268 .doubleBattle = FALSE, -#line 1204 +#line 1269 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1206 +#line 1271 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1208 +#line 1273 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1207 +#line 1272 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1209 +#line 1274 MOVE_QUICK_ATTACK, MOVE_AGILITY, MOVE_WING_ATTACK, @@ -3013,39 +3013,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 1213 +#line 1278 [TRAINER_PARKER] = { -#line 1214 +#line 1279 .trainerName = _("PARKER"), -#line 1215 +#line 1280 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1216 +#line 1281 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1218 +#line 1283 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1219 +#line 1284 .items = { ITEM_HYPER_POTION }, -#line 1220 +#line 1285 .doubleBattle = FALSE, -#line 1221 +#line 1286 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1223 +#line 1288 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1225 +#line 1290 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1224 +#line 1289 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1226 +#line 1291 MOVE_TEETER_DANCE, MOVE_DIZZY_PUNCH, MOVE_FOCUS_PUNCH, @@ -3053,41 +3053,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 1230 +#line 1295 [TRAINER_GEORGE] = { -#line 1231 +#line 1296 .trainerName = _("GEORGE"), -#line 1232 +#line 1297 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1233 +#line 1298 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1235 +#line 1300 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1236 +#line 1301 .items = { ITEM_HYPER_POTION }, -#line 1237 +#line 1302 .doubleBattle = FALSE, -#line 1238 +#line 1303 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1240 +#line 1305 .species = SPECIES_SLAKOTH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1240 +#line 1305 .heldItem = ITEM_SITRUS_BERRY, -#line 1242 +#line 1307 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1241 +#line 1306 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1243 +#line 1308 MOVE_SLACK_OFF, MOVE_COUNTER, MOVE_SHADOW_BALL, @@ -3095,78 +3095,78 @@ F_TRAINER_FEMALE | }, }, }, -#line 1247 +#line 1312 [TRAINER_BERKE] = { -#line 1248 +#line 1313 .trainerName = _("BERKE"), -#line 1249 +#line 1314 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1250 +#line 1315 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1252 +#line 1317 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1253 +#line 1318 .items = { ITEM_HYPER_POTION }, -#line 1254 +#line 1319 .doubleBattle = FALSE, -#line 1255 +#line 1320 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1257 +#line 1322 .species = SPECIES_VIGOROTH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1259 +#line 1324 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1258 +#line 1323 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1260 +#line 1325 MOVE_FOCUS_ENERGY, MOVE_SLASH, }, }, }, }, -#line 1263 +#line 1328 [TRAINER_BRAXTON] = { -#line 1264 +#line 1329 .trainerName = _("BRAXTON"), -#line 1265 +#line 1330 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1266 +#line 1331 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1268 +#line 1333 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1269 +#line 1334 .items = { ITEM_HYPER_POTION }, -#line 1270 +#line 1335 .doubleBattle = FALSE, -#line 1271 +#line 1336 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 1273 +#line 1338 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1275 +#line 1340 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1274 +#line 1339 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1276 +#line 1341 MOVE_FOCUS_ENERGY, MOVE_QUICK_ATTACK, MOVE_WING_ATTACK, @@ -3174,17 +3174,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1281 +#line 1346 .species = SPECIES_TRAPINCH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1283 +#line 1348 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1282 +#line 1347 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1284 +#line 1349 MOVE_BITE, MOVE_DIG, MOVE_FEINT_ATTACK, @@ -3192,17 +3192,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1289 +#line 1354 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1291 +#line 1356 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1290 +#line 1355 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1292 +#line 1357 MOVE_ROLLOUT, MOVE_WHIRLPOOL, MOVE_ASTONISH, @@ -3210,17 +3210,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1297 +#line 1362 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1299 +#line 1364 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1298 +#line 1363 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1300 +#line 1365 MOVE_THUNDERBOLT, MOVE_SUPERSONIC, MOVE_THUNDER_WAVE, @@ -3228,17 +3228,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1305 +#line 1370 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1307 +#line 1372 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1306 +#line 1371 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1308 +#line 1373 MOVE_GIGA_DRAIN, MOVE_FEINT_ATTACK, MOVE_DOUBLE_TEAM, @@ -3247,777 +3247,777 @@ F_TRAINER_FEMALE | }, }, }, -#line 1313 +#line 1378 [TRAINER_VINCENT] = { -#line 1314 +#line 1379 .trainerName = _("VINCENT"), -#line 1315 +#line 1380 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1316 +#line 1381 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1318 +#line 1383 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1319 +#line 1384 .items = { ITEM_FULL_RESTORE }, -#line 1320 +#line 1385 .doubleBattle = FALSE, -#line 1321 +#line 1386 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1323 +#line 1388 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1325 +#line 1390 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1324 +#line 1389 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1327 +#line 1392 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1329 +#line 1394 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1328 +#line 1393 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1331 +#line 1396 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1333 +#line 1398 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1332 +#line 1397 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1335 +#line 1400 [TRAINER_LEROY] = { -#line 1336 +#line 1401 .trainerName = _("LEROY"), -#line 1337 +#line 1402 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1338 +#line 1403 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1340 +#line 1405 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1341 +#line 1406 .items = { ITEM_FULL_RESTORE }, -#line 1342 +#line 1407 .doubleBattle = FALSE, -#line 1343 +#line 1408 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1345 +#line 1410 .species = SPECIES_MAWILE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1347 +#line 1412 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1346 +#line 1411 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1349 +#line 1414 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1351 +#line 1416 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1350 +#line 1415 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1353 +#line 1418 [TRAINER_WILTON_1] = { -#line 1354 +#line 1419 .trainerName = _("WILTON"), -#line 1355 +#line 1420 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1356 +#line 1421 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1358 +#line 1423 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1359 +#line 1424 .items = { ITEM_SUPER_POTION }, -#line 1360 +#line 1425 .doubleBattle = FALSE, -#line 1361 +#line 1426 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1363 +#line 1428 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1365 +#line 1430 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1364 +#line 1429 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1367 +#line 1432 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1369 +#line 1434 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1368 +#line 1433 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1371 +#line 1436 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1373 +#line 1438 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1372 +#line 1437 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1375 +#line 1440 [TRAINER_EDGAR] = { -#line 1376 +#line 1441 .trainerName = _("EDGAR"), -#line 1377 +#line 1442 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1378 +#line 1443 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1380 +#line 1445 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1381 +#line 1446 .items = { ITEM_FULL_RESTORE }, -#line 1382 +#line 1447 .doubleBattle = FALSE, -#line 1383 +#line 1448 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1385 +#line 1450 .species = SPECIES_CACTURNE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1387 +#line 1452 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1386 +#line 1451 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1389 +#line 1454 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1391 +#line 1456 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1390 +#line 1455 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1393 +#line 1458 [TRAINER_ALBERT] = { -#line 1394 +#line 1459 .trainerName = _("ALBERT"), -#line 1395 +#line 1460 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1396 +#line 1461 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1398 +#line 1463 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1399 +#line 1464 .items = { ITEM_FULL_RESTORE }, -#line 1400 +#line 1465 .doubleBattle = FALSE, -#line 1401 +#line 1466 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1403 +#line 1468 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1405 +#line 1470 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1404 +#line 1469 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1407 +#line 1472 .species = SPECIES_MUK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1409 +#line 1474 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1408 +#line 1473 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1411 +#line 1476 [TRAINER_SAMUEL] = { -#line 1412 +#line 1477 .trainerName = _("SAMUEL"), -#line 1413 +#line 1478 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1414 +#line 1479 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1416 +#line 1481 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1417 +#line 1482 .items = { ITEM_FULL_RESTORE }, -#line 1418 +#line 1483 .doubleBattle = FALSE, -#line 1419 +#line 1484 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1421 +#line 1486 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1423 +#line 1488 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1422 +#line 1487 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1425 +#line 1490 .species = SPECIES_MAWILE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1427 +#line 1492 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1426 +#line 1491 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1429 +#line 1494 .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1431 +#line 1496 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1430 +#line 1495 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1433 +#line 1498 [TRAINER_VITO] = { -#line 1434 +#line 1499 .trainerName = _("VITO"), -#line 1435 +#line 1500 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1436 +#line 1501 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1438 +#line 1503 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1439 +#line 1504 .items = { ITEM_FULL_RESTORE }, -#line 1440 +#line 1505 .doubleBattle = FALSE, -#line 1441 +#line 1506 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 1443 +#line 1508 .species = SPECIES_DODRIO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1445 +#line 1510 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1444 +#line 1509 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1447 +#line 1512 .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1449 +#line 1514 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1448 +#line 1513 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1451 +#line 1516 .species = SPECIES_ELECTRODE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1453 +#line 1518 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1452 +#line 1517 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1455 +#line 1520 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1457 +#line 1522 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1456 +#line 1521 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1459 +#line 1524 [TRAINER_OWEN] = { -#line 1460 +#line 1525 .trainerName = _("OWEN"), -#line 1461 +#line 1526 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1462 +#line 1527 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1464 +#line 1529 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1465 +#line 1530 .items = { ITEM_FULL_RESTORE }, -#line 1466 +#line 1531 .doubleBattle = FALSE, -#line 1467 +#line 1532 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1469 +#line 1534 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1471 +#line 1536 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1470 +#line 1535 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1473 +#line 1538 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1475 +#line 1540 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1474 +#line 1539 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1477 +#line 1542 .species = SPECIES_WAILORD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1479 +#line 1544 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1478 +#line 1543 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1481 +#line 1546 [TRAINER_WILTON_2] = { -#line 1482 +#line 1547 .trainerName = _("WILTON"), -#line 1483 +#line 1548 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1484 +#line 1549 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1486 +#line 1551 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1487 +#line 1552 .items = { ITEM_HYPER_POTION }, -#line 1488 +#line 1553 .doubleBattle = FALSE, -#line 1489 +#line 1554 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1491 +#line 1556 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1493 +#line 1558 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1492 +#line 1557 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1495 +#line 1560 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1497 +#line 1562 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1496 +#line 1561 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1499 +#line 1564 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1501 +#line 1566 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1500 +#line 1565 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1503 +#line 1568 [TRAINER_WILTON_3] = { -#line 1504 +#line 1569 .trainerName = _("WILTON"), -#line 1505 +#line 1570 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1506 +#line 1571 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1508 +#line 1573 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1509 +#line 1574 .items = { ITEM_HYPER_POTION }, -#line 1510 +#line 1575 .doubleBattle = FALSE, -#line 1511 +#line 1576 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1513 +#line 1578 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1515 +#line 1580 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1514 +#line 1579 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1517 +#line 1582 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1519 +#line 1584 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1518 +#line 1583 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1521 +#line 1586 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1523 +#line 1588 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1522 +#line 1587 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1525 +#line 1590 [TRAINER_WILTON_4] = { -#line 1526 +#line 1591 .trainerName = _("WILTON"), -#line 1527 +#line 1592 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1528 +#line 1593 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1530 +#line 1595 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1531 +#line 1596 .items = { ITEM_FULL_RESTORE }, -#line 1532 +#line 1597 .doubleBattle = FALSE, -#line 1533 +#line 1598 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1535 +#line 1600 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1537 +#line 1602 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1536 +#line 1601 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1539 +#line 1604 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1541 +#line 1606 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1540 +#line 1605 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1543 +#line 1608 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1545 +#line 1610 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1544 +#line 1609 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1547 +#line 1612 [TRAINER_WILTON_5] = { -#line 1548 +#line 1613 .trainerName = _("WILTON"), -#line 1549 +#line 1614 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1550 +#line 1615 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1552 +#line 1617 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1553 +#line 1618 .items = { ITEM_FULL_RESTORE }, -#line 1554 +#line 1619 .doubleBattle = FALSE, -#line 1555 +#line 1620 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1557 +#line 1622 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1559 +#line 1624 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1558 +#line 1623 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1561 +#line 1626 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1563 +#line 1628 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1562 +#line 1627 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1565 +#line 1630 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1567 +#line 1632 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1566 +#line 1631 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1569 +#line 1634 [TRAINER_WARREN] = { -#line 1570 +#line 1635 .trainerName = _("WARREN"), -#line 1571 +#line 1636 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1572 +#line 1637 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 1574 +#line 1639 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1575 +#line 1640 .items = { ITEM_FULL_RESTORE }, -#line 1576 +#line 1641 .doubleBattle = FALSE, -#line 1577 +#line 1642 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1579 +#line 1644 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1581 +#line 1646 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1580 +#line 1645 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1583 +#line 1648 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1585 +#line 1650 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1584 +#line 1649 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1587 +#line 1652 [TRAINER_MARY] = { -#line 1588 +#line 1653 .trainerName = _("MARY"), -#line 1589 +#line 1654 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1590 +#line 1655 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1591 +#line 1656 F_TRAINER_FEMALE | -#line 1592 +#line 1657 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1593 +#line 1658 .items = { ITEM_HYPER_POTION }, -#line 1594 +#line 1659 .doubleBattle = FALSE, -#line 1595 +#line 1660 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1597 +#line 1662 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1599 +#line 1664 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1598 +#line 1663 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1600 +#line 1665 MOVE_FEINT_ATTACK, MOVE_SHOCK_WAVE, }, }, }, }, -#line 1603 +#line 1668 [TRAINER_ALEXIA] = { -#line 1604 +#line 1669 .trainerName = _("ALEXIA"), -#line 1605 +#line 1670 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1606 +#line 1671 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1607 +#line 1672 F_TRAINER_FEMALE | -#line 1608 +#line 1673 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1609 +#line 1674 .items = { ITEM_HYPER_POTION }, -#line 1610 +#line 1675 .doubleBattle = FALSE, -#line 1611 +#line 1676 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1613 +#line 1678 .species = SPECIES_WIGGLYTUFF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1615 +#line 1680 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1614 +#line 1679 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1616 +#line 1681 MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, @@ -4025,82 +4025,82 @@ F_TRAINER_FEMALE | }, }, }, -#line 1620 +#line 1685 [TRAINER_JODY] = { -#line 1621 +#line 1686 .trainerName = _("JODY"), -#line 1622 +#line 1687 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1623 +#line 1688 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1624 +#line 1689 F_TRAINER_FEMALE | -#line 1625 +#line 1690 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1626 +#line 1691 .items = { ITEM_HYPER_POTION }, -#line 1627 +#line 1692 .doubleBattle = FALSE, -#line 1628 +#line 1693 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1630 +#line 1695 .species = SPECIES_ZANGOOSE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1632 +#line 1697 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1631 +#line 1696 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1633 +#line 1698 MOVE_SWORDS_DANCE, MOVE_SLASH, }, }, }, }, -#line 1636 +#line 1701 [TRAINER_WENDY] = { -#line 1637 +#line 1702 .trainerName = _("WENDY"), -#line 1638 +#line 1703 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1639 +#line 1704 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1640 +#line 1705 F_TRAINER_FEMALE | -#line 1641 +#line 1706 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1642 +#line 1707 .items = { ITEM_FULL_RESTORE }, -#line 1643 +#line 1708 .doubleBattle = FALSE, -#line 1644 +#line 1709 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1646 +#line 1711 .species = SPECIES_MAWILE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1648 +#line 1713 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1647 +#line 1712 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1649 +#line 1714 MOVE_BATON_PASS, MOVE_FEINT_ATTACK, MOVE_FAKE_TEARS, @@ -4108,17 +4108,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1654 +#line 1719 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1656 +#line 1721 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1655 +#line 1720 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1657 +#line 1722 MOVE_MEGA_DRAIN, MOVE_MAGICAL_LEAF, MOVE_GRASS_WHISTLE, @@ -4126,17 +4126,17 @@ F_TRAINER_FEMALE | }, }, { -#line 1662 +#line 1727 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1664 +#line 1729 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1663 +#line 1728 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 1665 +#line 1730 MOVE_FLY, MOVE_WATER_GUN, MOVE_MIST, @@ -4145,1083 +4145,1083 @@ F_TRAINER_FEMALE | }, }, }, -#line 1670 +#line 1735 [TRAINER_KEIRA] = { -#line 1671 +#line 1736 .trainerName = _("KEIRA"), -#line 1672 +#line 1737 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1673 +#line 1738 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1674 +#line 1739 F_TRAINER_FEMALE | -#line 1675 +#line 1740 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1676 +#line 1741 .items = { ITEM_FULL_RESTORE }, -#line 1677 +#line 1742 .doubleBattle = FALSE, -#line 1678 +#line 1743 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1680 +#line 1745 .species = SPECIES_LAIRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1682 +#line 1747 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1681 +#line 1746 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1684 +#line 1749 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1686 +#line 1751 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1685 +#line 1750 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1688 +#line 1753 [TRAINER_BROOKE_1] = { -#line 1689 +#line 1754 .trainerName = _("BROOKE"), -#line 1690 +#line 1755 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1691 +#line 1756 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1692 +#line 1757 F_TRAINER_FEMALE | -#line 1693 +#line 1758 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1694 +#line 1759 .items = { ITEM_SUPER_POTION }, -#line 1695 +#line 1760 .doubleBattle = FALSE, -#line 1696 +#line 1761 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1698 +#line 1763 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1700 +#line 1765 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1699 +#line 1764 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1702 +#line 1767 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1704 +#line 1769 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1703 +#line 1768 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1706 +#line 1771 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1708 +#line 1773 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1707 +#line 1772 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1710 +#line 1775 [TRAINER_JENNIFER] = { -#line 1711 +#line 1776 .trainerName = _("JENNIFER"), -#line 1712 +#line 1777 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1713 +#line 1778 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1714 +#line 1779 F_TRAINER_FEMALE | -#line 1715 +#line 1780 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1716 +#line 1781 .items = { ITEM_FULL_RESTORE }, -#line 1717 +#line 1782 .doubleBattle = FALSE, -#line 1718 +#line 1783 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1720 +#line 1785 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1722 +#line 1787 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 1721 +#line 1786 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1724 +#line 1789 [TRAINER_HOPE] = { -#line 1725 +#line 1790 .trainerName = _("HOPE"), -#line 1726 +#line 1791 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1727 +#line 1792 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1728 +#line 1793 F_TRAINER_FEMALE | -#line 1729 +#line 1794 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1730 +#line 1795 .items = { ITEM_FULL_RESTORE }, -#line 1731 +#line 1796 .doubleBattle = FALSE, -#line 1732 +#line 1797 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1734 +#line 1799 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1736 +#line 1801 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1735 +#line 1800 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1738 +#line 1803 [TRAINER_SHANNON] = { -#line 1739 +#line 1804 .trainerName = _("SHANNON"), -#line 1740 +#line 1805 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1741 +#line 1806 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1742 +#line 1807 F_TRAINER_FEMALE | -#line 1743 +#line 1808 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1744 +#line 1809 .items = { ITEM_FULL_RESTORE }, -#line 1745 +#line 1810 .doubleBattle = FALSE, -#line 1746 +#line 1811 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1748 +#line 1813 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1750 +#line 1815 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1749 +#line 1814 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1752 +#line 1817 [TRAINER_MICHELLE] = { -#line 1753 +#line 1818 .trainerName = _("MICHELLE"), -#line 1754 +#line 1819 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1755 +#line 1820 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1756 +#line 1821 F_TRAINER_FEMALE | -#line 1757 +#line 1822 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1758 +#line 1823 .items = { ITEM_FULL_RESTORE }, -#line 1759 +#line 1824 .doubleBattle = FALSE, -#line 1760 +#line 1825 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1762 +#line 1827 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1764 +#line 1829 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1763 +#line 1828 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1766 +#line 1831 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1768 +#line 1833 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1767 +#line 1832 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1770 +#line 1835 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1772 +#line 1837 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1771 +#line 1836 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1774 +#line 1839 [TRAINER_CAROLINE] = { -#line 1775 +#line 1840 .trainerName = _("CAROLINE"), -#line 1776 +#line 1841 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1777 +#line 1842 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1778 +#line 1843 F_TRAINER_FEMALE | -#line 1779 +#line 1844 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1780 +#line 1845 .items = { ITEM_FULL_RESTORE }, -#line 1781 +#line 1846 .doubleBattle = FALSE, -#line 1782 +#line 1847 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1784 +#line 1849 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1786 +#line 1851 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1785 +#line 1850 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1788 +#line 1853 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1790 +#line 1855 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1789 +#line 1854 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1792 +#line 1857 [TRAINER_JULIE] = { -#line 1793 +#line 1858 .trainerName = _("JULIE"), -#line 1794 +#line 1859 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1795 +#line 1860 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1796 +#line 1861 F_TRAINER_FEMALE | -#line 1797 +#line 1862 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1798 +#line 1863 .items = { ITEM_FULL_RESTORE }, -#line 1799 +#line 1864 .doubleBattle = FALSE, -#line 1800 +#line 1865 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1802 +#line 1867 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1804 +#line 1869 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1803 +#line 1868 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1806 +#line 1871 .species = SPECIES_NINETALES, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1808 +#line 1873 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1807 +#line 1872 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1810 +#line 1875 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1812 +#line 1877 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1811 +#line 1876 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1814 +#line 1879 [TRAINER_BROOKE_2] = { -#line 1815 +#line 1880 .trainerName = _("BROOKE"), -#line 1816 +#line 1881 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1817 +#line 1882 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1818 +#line 1883 F_TRAINER_FEMALE | -#line 1819 +#line 1884 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1820 +#line 1885 .items = { ITEM_HYPER_POTION }, -#line 1821 +#line 1886 .doubleBattle = FALSE, -#line 1822 +#line 1887 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 1824 +#line 1889 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1826 +#line 1891 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1825 +#line 1890 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1828 +#line 1893 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1830 +#line 1895 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1829 +#line 1894 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1832 +#line 1897 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1834 +#line 1899 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1833 +#line 1898 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1836 +#line 1901 [TRAINER_BROOKE_3] = { -#line 1837 - .trainerName = _("BROOKE"), -#line 1838 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1839 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1840 -F_TRAINER_FEMALE | -#line 1841 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1842 - .items = { ITEM_HYPER_POTION }, -#line 1843 - .doubleBattle = FALSE, -#line 1844 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1846 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1848 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1847 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1850 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1852 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1851 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1854 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1856 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1855 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1858 - [TRAINER_BROOKE_4] = - { -#line 1859 - .trainerName = _("BROOKE"), -#line 1860 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1861 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1862 -F_TRAINER_FEMALE | -#line 1863 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1864 - .items = { ITEM_FULL_RESTORE }, -#line 1865 - .doubleBattle = FALSE, -#line 1866 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1868 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1870 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1869 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1872 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1874 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1873 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1876 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1878 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1877 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1880 - [TRAINER_BROOKE_5] = - { -#line 1881 - .trainerName = _("BROOKE"), -#line 1882 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1883 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1884 -F_TRAINER_FEMALE | -#line 1885 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1886 - .items = { ITEM_FULL_RESTORE }, -#line 1887 - .doubleBattle = FALSE, -#line 1888 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1890 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1892 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1891 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1894 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1896 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1895 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1898 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1900 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1899 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, #line 1902 - [TRAINER_PATRICIA] = - { + .trainerName = _("BROOKE"), #line 1903 - .trainerName = _("PATRICIA"), + .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 1904 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1905 - .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 1906 +#line 1905 F_TRAINER_FEMALE | +#line 1906 + TRAINER_ENCOUNTER_MUSIC_COOL, #line 1907 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .items = { ITEM_HYPER_POTION }, #line 1908 .doubleBattle = FALSE, #line 1909 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, .party = (const struct TrainerMon[]) { { #line 1911 - .species = SPECIES_BANETTE, + .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, #line 1913 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), #line 1912 - .lvl = 41, + .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 1915 - .species = SPECIES_LUNATONE, + .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, #line 1917 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), #line 1916 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1919 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1921 + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), +#line 1920 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 1923 + [TRAINER_BROOKE_4] = + { +#line 1924 + .trainerName = _("BROOKE"), +#line 1925 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 1926 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 1927 +F_TRAINER_FEMALE | +#line 1928 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 1929 + .items = { ITEM_FULL_RESTORE }, +#line 1930 + .doubleBattle = FALSE, +#line 1931 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 1933 + .species = SPECIES_PELIPPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1935 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 1934 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1937 + .species = SPECIES_NUMEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1939 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 1938 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1941 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1943 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 1942 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 1945 + [TRAINER_BROOKE_5] = + { +#line 1946 + .trainerName = _("BROOKE"), +#line 1947 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 1948 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 1949 +F_TRAINER_FEMALE | +#line 1950 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 1951 + .items = { ITEM_FULL_RESTORE }, +#line 1952 + .doubleBattle = FALSE, +#line 1953 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 1955 + .species = SPECIES_PELIPPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1957 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 1956 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1959 + .species = SPECIES_CAMERUPT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1961 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 1960 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1963 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1965 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 1964 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 1967 + [TRAINER_PATRICIA] = + { +#line 1968 + .trainerName = _("PATRICIA"), +#line 1969 + .trainerClass = TRAINER_CLASS_HEX_MANIAC, +#line 1970 + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .encounterMusic_gender = +#line 1971 +F_TRAINER_FEMALE | +#line 1972 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 1973 + .doubleBattle = FALSE, +#line 1974 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 1976 + .species = SPECIES_BANETTE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1978 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 1977 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 1980 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 1982 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 1981 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1919 +#line 1984 [TRAINER_KINDRA] = { -#line 1920 +#line 1985 .trainerName = _("KINDRA"), -#line 1921 +#line 1986 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1922 +#line 1987 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 1923 +#line 1988 F_TRAINER_FEMALE | -#line 1924 +#line 1989 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1925 +#line 1990 .doubleBattle = FALSE, -#line 1926 +#line 1991 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1928 +#line 1993 .species = SPECIES_DUSKULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1930 +#line 1995 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1929 +#line 1994 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1932 +#line 1997 .species = SPECIES_SHUPPET, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1934 +#line 1999 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1933 +#line 1998 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1936 +#line 2001 [TRAINER_TAMMY] = { -#line 1937 +#line 2002 .trainerName = _("TAMMY"), -#line 1938 +#line 2003 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1939 +#line 2004 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 1940 +#line 2005 F_TRAINER_FEMALE | -#line 1941 +#line 2006 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1942 +#line 2007 .doubleBattle = FALSE, -#line 1943 +#line 2008 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1945 +#line 2010 .species = SPECIES_DUSKULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1947 +#line 2012 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1946 +#line 2011 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1949 +#line 2014 .species = SPECIES_SHUPPET, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1951 +#line 2016 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1950 +#line 2015 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1953 +#line 2018 [TRAINER_VALERIE_1] = { -#line 1954 +#line 2019 .trainerName = _("VALERIE"), -#line 1955 +#line 2020 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1956 +#line 2021 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 1957 +#line 2022 F_TRAINER_FEMALE | -#line 1958 +#line 2023 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1959 +#line 2024 .doubleBattle = FALSE, -#line 1960 +#line 2025 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1962 +#line 2027 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1964 +#line 2029 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1963 +#line 2028 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1966 +#line 2031 [TRAINER_TASHA] = { -#line 1967 +#line 2032 .trainerName = _("TASHA"), -#line 1968 +#line 2033 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1969 +#line 2034 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 1970 +#line 2035 F_TRAINER_FEMALE | -#line 1971 +#line 2036 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1972 +#line 2037 .doubleBattle = FALSE, -#line 1973 +#line 2038 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 1975 +#line 2040 .species = SPECIES_SHUPPET, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1977 +#line 2042 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 1976 +#line 2041 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1979 +#line 2044 [TRAINER_VALERIE_2] = { -#line 1980 +#line 2045 .trainerName = _("VALERIE"), -#line 1981 +#line 2046 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1982 +#line 2047 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 1983 +#line 2048 F_TRAINER_FEMALE | -#line 1984 +#line 2049 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1985 +#line 2050 .doubleBattle = FALSE, -#line 1986 +#line 2051 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 1988 +#line 2053 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1990 +#line 2055 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1989 +#line 2054 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 1992 +#line 2057 .species = SPECIES_SPOINK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 1994 +#line 2059 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1993 +#line 2058 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 1996 +#line 2061 [TRAINER_VALERIE_3] = { -#line 1997 +#line 2062 .trainerName = _("VALERIE"), -#line 1998 +#line 2063 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1999 +#line 2064 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 2000 +#line 2065 F_TRAINER_FEMALE | -#line 2001 +#line 2066 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2002 +#line 2067 .doubleBattle = FALSE, -#line 2003 +#line 2068 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2005 +#line 2070 .species = SPECIES_SPOINK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2007 +#line 2072 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2006 +#line 2071 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2009 +#line 2074 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2011 +#line 2076 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2010 +#line 2075 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2013 +#line 2078 [TRAINER_VALERIE_4] = { -#line 2014 +#line 2079 .trainerName = _("VALERIE"), -#line 2015 +#line 2080 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2016 +#line 2081 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 2017 +#line 2082 F_TRAINER_FEMALE | -#line 2018 +#line 2083 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2019 +#line 2084 .doubleBattle = FALSE, -#line 2020 +#line 2085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2022 +#line 2087 .species = SPECIES_SPOINK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2024 +#line 2089 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2023 +#line 2088 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2026 +#line 2091 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2028 +#line 2093 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2027 +#line 2092 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2030 +#line 2095 [TRAINER_VALERIE_5] = { -#line 2031 +#line 2096 .trainerName = _("VALERIE"), -#line 2032 +#line 2097 .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2033 +#line 2098 .trainerPic = TRAINER_PIC_HEX_MANIAC, .encounterMusic_gender = -#line 2034 +#line 2099 F_TRAINER_FEMALE | -#line 2035 +#line 2100 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2036 +#line 2101 .doubleBattle = FALSE, -#line 2037 +#line 2102 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 2039 +#line 2104 .species = SPECIES_DUSKULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2041 +#line 2106 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2040 +#line 2105 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2043 +#line 2108 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2045 +#line 2110 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2044 +#line 2109 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2047 +#line 2112 .species = SPECIES_GRUMPIG, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2049 +#line 2114 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2048 +#line 2113 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2051 +#line 2116 [TRAINER_CINDY_1] = { -#line 2052 +#line 2117 .trainerName = _("CINDY"), -#line 2053 +#line 2118 .trainerClass = TRAINER_CLASS_LADY, -#line 2054 +#line 2119 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2055 +#line 2120 F_TRAINER_FEMALE | -#line 2056 +#line 2121 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2057 +#line 2122 .items = { ITEM_FULL_RESTORE }, -#line 2058 +#line 2123 .doubleBattle = FALSE, -#line 2059 +#line 2124 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2061 +#line 2126 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2061 +#line 2126 .heldItem = ITEM_NUGGET, -#line 2063 +#line 2128 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2062 +#line 2127 .lvl = 7, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2065 +#line 2130 [TRAINER_DAPHNE] = { -#line 2066 +#line 2131 .trainerName = _("DAPHNE"), -#line 2067 +#line 2132 .trainerClass = TRAINER_CLASS_LADY, -#line 2068 +#line 2133 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2069 +#line 2134 F_TRAINER_FEMALE | -#line 2070 +#line 2135 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2071 +#line 2136 .items = { ITEM_FULL_RESTORE }, -#line 2072 +#line 2137 .doubleBattle = FALSE, -#line 2073 +#line 2138 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2075 +#line 2140 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2075 +#line 2140 .heldItem = ITEM_NUGGET, -#line 2077 +#line 2142 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2076 +#line 2141 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2078 +#line 2143 MOVE_ATTRACT, MOVE_SWEET_KISS, MOVE_FLAIL, @@ -5229,19 +5229,19 @@ F_TRAINER_FEMALE | }, }, { -#line 2083 +#line 2148 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2083 +#line 2148 .heldItem = ITEM_NUGGET, -#line 2085 +#line 2150 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2084 +#line 2149 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2086 +#line 2151 MOVE_ATTRACT, MOVE_SAFEGUARD, MOVE_TAKE_DOWN, @@ -5250,330 +5250,330 @@ F_TRAINER_FEMALE | }, }, }, -#line 2091 +#line 2156 [TRAINER_GRUNT_SPACE_CENTER_2] = { -#line 2092 +#line 2157 .trainerName = _("GRUNT"), -#line 2093 +#line 2158 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2094 +#line 2159 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 2096 +#line 2161 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2097 +#line 2162 .doubleBattle = FALSE, -#line 2098 +#line 2163 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 2100 +#line 2165 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2102 +#line 2167 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2101 +#line 2166 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2104 +#line 2169 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2106 +#line 2171 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2105 +#line 2170 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2108 +#line 2173 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2110 +#line 2175 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2109 +#line 2174 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2112 +#line 2177 [TRAINER_CINDY_2] = { -#line 2113 +#line 2178 .trainerName = _("CINDY"), -#line 2114 +#line 2179 .trainerClass = TRAINER_CLASS_LADY, -#line 2115 +#line 2180 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2116 +#line 2181 F_TRAINER_FEMALE | -#line 2117 +#line 2182 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2118 +#line 2183 .items = { ITEM_FULL_RESTORE }, -#line 2119 +#line 2184 .doubleBattle = FALSE, -#line 2120 +#line 2185 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2122 +#line 2187 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2122 +#line 2187 .heldItem = ITEM_NUGGET, -#line 2124 +#line 2189 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2123 +#line 2188 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2125 +#line 2190 MOVE_TACKLE, MOVE_TAIL_WHIP, }, }, }, }, -#line 2128 +#line 2193 [TRAINER_BRIANNA] = { -#line 2129 +#line 2194 .trainerName = _("BRIANNA"), -#line 2130 +#line 2195 .trainerClass = TRAINER_CLASS_LADY, -#line 2131 +#line 2196 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2132 +#line 2197 F_TRAINER_FEMALE | -#line 2133 +#line 2198 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2134 +#line 2199 .items = { ITEM_FULL_RESTORE }, -#line 2135 +#line 2200 .doubleBattle = FALSE, -#line 2136 +#line 2201 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2138 +#line 2203 .species = SPECIES_SEAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2138 +#line 2203 .heldItem = ITEM_NUGGET, -#line 2140 +#line 2205 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2139 +#line 2204 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2142 +#line 2207 [TRAINER_NAOMI] = { -#line 2143 +#line 2208 .trainerName = _("NAOMI"), -#line 2144 +#line 2209 .trainerClass = TRAINER_CLASS_LADY, -#line 2145 +#line 2210 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2146 +#line 2211 F_TRAINER_FEMALE | -#line 2147 +#line 2212 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2148 +#line 2213 .items = { ITEM_FULL_RESTORE }, -#line 2149 +#line 2214 .doubleBattle = FALSE, -#line 2150 +#line 2215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2152 +#line 2217 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2152 +#line 2217 .heldItem = ITEM_NUGGET, -#line 2154 +#line 2219 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2153 +#line 2218 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2156 +#line 2221 [TRAINER_CINDY_3] = { -#line 2157 +#line 2222 .trainerName = _("CINDY"), -#line 2158 +#line 2223 .trainerClass = TRAINER_CLASS_LADY, -#line 2159 +#line 2224 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2160 +#line 2225 F_TRAINER_FEMALE | -#line 2161 +#line 2226 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2162 +#line 2227 .items = { ITEM_FULL_RESTORE }, -#line 2163 +#line 2228 .doubleBattle = FALSE, -#line 2164 +#line 2229 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2166 +#line 2231 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2166 +#line 2231 .heldItem = ITEM_NUGGET, -#line 2168 +#line 2233 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2167 +#line 2232 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2170 +#line 2235 [TRAINER_CINDY_4] = { -#line 2171 +#line 2236 .trainerName = _("CINDY"), -#line 2172 +#line 2237 .trainerClass = TRAINER_CLASS_LADY, -#line 2173 +#line 2238 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2174 +#line 2239 F_TRAINER_FEMALE | -#line 2175 +#line 2240 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2176 +#line 2241 .items = { ITEM_FULL_RESTORE }, -#line 2177 +#line 2242 .doubleBattle = FALSE, -#line 2178 +#line 2243 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2180 +#line 2245 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2180 +#line 2245 .heldItem = ITEM_NUGGET, -#line 2182 +#line 2247 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2181 +#line 2246 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2184 +#line 2249 [TRAINER_CINDY_5] = { -#line 2185 +#line 2250 .trainerName = _("CINDY"), -#line 2186 +#line 2251 .trainerClass = TRAINER_CLASS_LADY, -#line 2187 +#line 2252 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2188 +#line 2253 F_TRAINER_FEMALE | -#line 2189 +#line 2254 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2190 +#line 2255 .items = { ITEM_FULL_RESTORE }, -#line 2191 +#line 2256 .doubleBattle = FALSE, -#line 2192 +#line 2257 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2194 +#line 2259 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2194 +#line 2259 .heldItem = ITEM_NUGGET, -#line 2196 +#line 2261 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2195 +#line 2260 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2198 +#line 2263 [TRAINER_CINDY_6] = { -#line 2199 +#line 2264 .trainerName = _("CINDY"), -#line 2200 +#line 2265 .trainerClass = TRAINER_CLASS_LADY, -#line 2201 +#line 2266 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 2202 +#line 2267 F_TRAINER_FEMALE | -#line 2203 +#line 2268 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2204 +#line 2269 .items = { ITEM_FULL_RESTORE }, -#line 2205 +#line 2270 .doubleBattle = FALSE, -#line 2206 +#line 2271 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2208 +#line 2273 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2208 +#line 2273 .heldItem = ITEM_NUGGET, -#line 2210 +#line 2275 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2209 +#line 2274 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2211 +#line 2276 MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, @@ -5582,141 +5582,141 @@ F_TRAINER_FEMALE | }, }, }, -#line 2216 +#line 2281 [TRAINER_MELISSA] = { -#line 2217 +#line 2282 .trainerName = _("MELISSA"), -#line 2218 +#line 2283 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2219 +#line 2284 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2220 +#line 2285 F_TRAINER_FEMALE | -#line 2221 +#line 2286 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2222 +#line 2287 .doubleBattle = FALSE, -#line 2223 +#line 2288 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2225 +#line 2290 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2227 +#line 2292 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2226 +#line 2291 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2229 +#line 2294 [TRAINER_SHEILA] = { -#line 2230 +#line 2295 .trainerName = _("SHEILA"), -#line 2231 +#line 2296 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2232 +#line 2297 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2233 +#line 2298 F_TRAINER_FEMALE | -#line 2234 +#line 2299 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2235 +#line 2300 .doubleBattle = FALSE, -#line 2236 +#line 2301 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2238 +#line 2303 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2240 +#line 2305 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2239 +#line 2304 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2242 +#line 2307 [TRAINER_SHIRLEY] = { -#line 2243 +#line 2308 .trainerName = _("SHIRLEY"), -#line 2244 +#line 2309 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2245 +#line 2310 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2246 +#line 2311 F_TRAINER_FEMALE | -#line 2247 +#line 2312 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2248 +#line 2313 .doubleBattle = FALSE, -#line 2249 +#line 2314 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2251 +#line 2316 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2253 +#line 2318 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2252 +#line 2317 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2255 +#line 2320 [TRAINER_JESSICA_1] = { -#line 2256 +#line 2321 .trainerName = _("JESSICA"), -#line 2257 +#line 2322 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2258 +#line 2323 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2259 +#line 2324 F_TRAINER_FEMALE | -#line 2260 +#line 2325 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2261 +#line 2326 .doubleBattle = FALSE, -#line 2262 +#line 2327 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2264 +#line 2329 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2266 +#line 2331 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2265 +#line 2330 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2267 +#line 2332 MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, @@ -5724,17 +5724,17 @@ F_TRAINER_FEMALE | }, }, { -#line 2272 +#line 2337 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2274 +#line 2339 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2273 +#line 2338 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2275 +#line 2340 MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, @@ -5743,107 +5743,107 @@ F_TRAINER_FEMALE | }, }, }, -#line 2280 +#line 2345 [TRAINER_CONNIE] = { -#line 2281 +#line 2346 .trainerName = _("CONNIE"), -#line 2282 +#line 2347 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2283 +#line 2348 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2284 +#line 2349 F_TRAINER_FEMALE | -#line 2285 +#line 2350 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2286 +#line 2351 .doubleBattle = FALSE, -#line 2287 +#line 2352 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2289 +#line 2354 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2291 +#line 2356 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2290 +#line 2355 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2293 +#line 2358 [TRAINER_BRIDGET] = { -#line 2294 +#line 2359 .trainerName = _("BRIDGET"), -#line 2295 +#line 2360 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2296 +#line 2361 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2297 +#line 2362 F_TRAINER_FEMALE | -#line 2298 +#line 2363 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2299 +#line 2364 .doubleBattle = FALSE, -#line 2300 +#line 2365 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2302 +#line 2367 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2304 +#line 2369 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2303 +#line 2368 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2306 +#line 2371 [TRAINER_OLIVIA] = { -#line 2307 +#line 2372 .trainerName = _("OLIVIA"), -#line 2308 +#line 2373 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2309 +#line 2374 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2310 +#line 2375 F_TRAINER_FEMALE | -#line 2311 +#line 2376 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2312 +#line 2377 .doubleBattle = FALSE, -#line 2313 +#line 2378 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 2315 +#line 2380 .species = SPECIES_CLAMPERL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2317 +#line 2382 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2316 +#line 2381 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2318 +#line 2383 MOVE_IRON_DEFENSE, MOVE_WHIRLPOOL, MOVE_RAIN_DANCE, @@ -5851,34 +5851,34 @@ F_TRAINER_FEMALE | }, }, { -#line 2323 +#line 2388 .species = SPECIES_CORPHISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2325 +#line 2390 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2324 +#line 2389 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2326 +#line 2391 MOVE_TAUNT, MOVE_CRABHAMMER, MOVE_WATER_PULSE, }, }, { -#line 2330 +#line 2395 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2332 +#line 2397 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2331 +#line 2396 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2333 +#line 2398 MOVE_UPROAR, MOVE_FURY_SWIPES, MOVE_FAKE_OUT, @@ -5887,84 +5887,84 @@ F_TRAINER_FEMALE | }, }, }, -#line 2338 +#line 2403 [TRAINER_TIFFANY] = { -#line 2339 +#line 2404 .trainerName = _("TIFFANY"), -#line 2340 +#line 2405 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2341 +#line 2406 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2342 +#line 2407 F_TRAINER_FEMALE | -#line 2343 +#line 2408 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2344 +#line 2409 .doubleBattle = FALSE, -#line 2345 +#line 2410 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2347 +#line 2412 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2349 +#line 2414 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2348 +#line 2413 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2351 +#line 2416 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2353 +#line 2418 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2352 +#line 2417 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2355 +#line 2420 [TRAINER_JESSICA_2] = { -#line 2356 +#line 2421 .trainerName = _("JESSICA"), -#line 2357 +#line 2422 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2358 +#line 2423 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2359 +#line 2424 F_TRAINER_FEMALE | -#line 2360 +#line 2425 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2361 +#line 2426 .doubleBattle = FALSE, -#line 2362 +#line 2427 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2364 +#line 2429 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2366 +#line 2431 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2365 +#line 2430 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2367 +#line 2432 MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, @@ -5972,17 +5972,17 @@ F_TRAINER_FEMALE | }, }, { -#line 2372 +#line 2437 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2374 +#line 2439 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2373 +#line 2438 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2375 +#line 2440 MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, @@ -5991,39 +5991,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 2380 +#line 2445 [TRAINER_JESSICA_3] = { -#line 2381 +#line 2446 .trainerName = _("JESSICA"), -#line 2382 +#line 2447 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2383 +#line 2448 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2384 +#line 2449 F_TRAINER_FEMALE | -#line 2385 +#line 2450 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2386 +#line 2451 .doubleBattle = FALSE, -#line 2387 +#line 2452 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2389 +#line 2454 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2391 +#line 2456 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2390 +#line 2455 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2392 +#line 2457 MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, @@ -6031,17 +6031,17 @@ F_TRAINER_FEMALE | }, }, { -#line 2397 +#line 2462 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2399 +#line 2464 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2398 +#line 2463 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2400 +#line 2465 MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, @@ -6050,39 +6050,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 2405 +#line 2470 [TRAINER_JESSICA_4] = { -#line 2406 +#line 2471 .trainerName = _("JESSICA"), -#line 2407 +#line 2472 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2408 +#line 2473 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2409 +#line 2474 F_TRAINER_FEMALE | -#line 2410 +#line 2475 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2411 +#line 2476 .doubleBattle = FALSE, -#line 2412 +#line 2477 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2414 +#line 2479 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2416 +#line 2481 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2415 +#line 2480 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2417 +#line 2482 MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, @@ -6090,17 +6090,17 @@ F_TRAINER_FEMALE | }, }, { -#line 2422 +#line 2487 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2424 +#line 2489 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2423 +#line 2488 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2425 +#line 2490 MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, @@ -6109,39 +6109,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 2430 +#line 2495 [TRAINER_JESSICA_5] = { -#line 2431 +#line 2496 .trainerName = _("JESSICA"), -#line 2432 +#line 2497 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2433 +#line 2498 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2434 +#line 2499 F_TRAINER_FEMALE | -#line 2435 +#line 2500 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2436 +#line 2501 .doubleBattle = FALSE, -#line 2437 +#line 2502 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2439 +#line 2504 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2441 +#line 2506 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2440 +#line 2505 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2442 +#line 2507 MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, @@ -6149,17 +6149,17 @@ F_TRAINER_FEMALE | }, }, { -#line 2447 +#line 2512 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2449 +#line 2514 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2448 +#line 2513 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2450 +#line 2515 MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, @@ -6168,266 +6168,266 @@ F_TRAINER_FEMALE | }, }, }, -#line 2455 +#line 2520 [TRAINER_WINSTON_1] = { -#line 2456 +#line 2521 .trainerName = _("WINSTON"), -#line 2457 +#line 2522 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2458 +#line 2523 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2460 +#line 2525 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2461 +#line 2526 .items = { ITEM_FULL_RESTORE }, -#line 2462 +#line 2527 .doubleBattle = FALSE, -#line 2463 +#line 2528 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2465 +#line 2530 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2465 +#line 2530 .heldItem = ITEM_NUGGET, -#line 2467 +#line 2532 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2466 +#line 2531 .lvl = 7, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2469 +#line 2534 [TRAINER_MOLLIE] = { -#line 2470 +#line 2535 .trainerName = _("MOLLIE"), -#line 2471 +#line 2536 .trainerClass = TRAINER_CLASS_EXPERT, -#line 2472 +#line 2537 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 2473 +#line 2538 F_TRAINER_FEMALE | -#line 2474 +#line 2539 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 2475 +#line 2540 .doubleBattle = FALSE, -#line 2476 +#line 2541 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2478 +#line 2543 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2480 +#line 2545 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2479 +#line 2544 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2482 +#line 2547 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2484 +#line 2549 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 2483 +#line 2548 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2486 +#line 2551 [TRAINER_GARRET] = { -#line 2487 +#line 2552 .trainerName = _("GARRET"), -#line 2488 +#line 2553 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2489 +#line 2554 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2491 +#line 2556 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2492 +#line 2557 .items = { ITEM_FULL_RESTORE }, -#line 2493 +#line 2558 .doubleBattle = FALSE, -#line 2494 +#line 2559 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2496 +#line 2561 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2496 +#line 2561 .heldItem = ITEM_NUGGET, -#line 2498 +#line 2563 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2497 +#line 2562 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2500 +#line 2565 [TRAINER_WINSTON_2] = { -#line 2501 +#line 2566 .trainerName = _("WINSTON"), -#line 2502 +#line 2567 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2503 +#line 2568 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2505 +#line 2570 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2506 +#line 2571 .items = { ITEM_FULL_RESTORE }, -#line 2507 +#line 2572 .doubleBattle = FALSE, -#line 2508 +#line 2573 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2510 +#line 2575 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2510 +#line 2575 .heldItem = ITEM_NUGGET, -#line 2512 +#line 2577 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2511 +#line 2576 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2514 +#line 2579 [TRAINER_WINSTON_3] = { -#line 2515 +#line 2580 .trainerName = _("WINSTON"), -#line 2516 +#line 2581 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2517 +#line 2582 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2519 +#line 2584 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2520 +#line 2585 .items = { ITEM_FULL_RESTORE }, -#line 2521 +#line 2586 .doubleBattle = FALSE, -#line 2522 +#line 2587 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2524 +#line 2589 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2524 +#line 2589 .heldItem = ITEM_NUGGET, -#line 2526 +#line 2591 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2525 +#line 2590 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2528 +#line 2593 [TRAINER_WINSTON_4] = { -#line 2529 +#line 2594 .trainerName = _("WINSTON"), -#line 2530 +#line 2595 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2531 +#line 2596 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2533 +#line 2598 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2534 +#line 2599 .items = { ITEM_FULL_RESTORE }, -#line 2535 +#line 2600 .doubleBattle = FALSE, -#line 2536 +#line 2601 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2538 +#line 2603 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2538 +#line 2603 .heldItem = ITEM_NUGGET, -#line 2540 +#line 2605 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2539 +#line 2604 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2542 +#line 2607 [TRAINER_WINSTON_5] = { -#line 2543 +#line 2608 .trainerName = _("WINSTON"), -#line 2544 +#line 2609 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2545 +#line 2610 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 2547 +#line 2612 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2548 +#line 2613 .items = { ITEM_FULL_RESTORE }, -#line 2549 +#line 2614 .doubleBattle = FALSE, -#line 2550 +#line 2615 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2552 +#line 2617 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2552 +#line 2617 .heldItem = ITEM_NUGGET, -#line 2554 +#line 2619 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2553 +#line 2618 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 2555 +#line 2620 MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, @@ -6436,1135 +6436,975 @@ F_TRAINER_FEMALE | }, }, }, -#line 2560 +#line 2625 [TRAINER_STEVE_1] = { -#line 2561 +#line 2626 .trainerName = _("STEVE"), -#line 2562 +#line 2627 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2563 +#line 2628 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2565 +#line 2630 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2566 +#line 2631 .doubleBattle = FALSE, -#line 2567 +#line 2632 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2569 +#line 2634 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2571 +#line 2636 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2570 +#line 2635 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2573 +#line 2638 [TRAINER_THALIA_1] = { -#line 2574 +#line 2639 .trainerName = _("THALIA"), -#line 2575 +#line 2640 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2576 +#line 2641 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 2577 +#line 2642 F_TRAINER_FEMALE | -#line 2578 +#line 2643 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2579 +#line 2644 .doubleBattle = FALSE, -#line 2580 +#line 2645 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2582 +#line 2647 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2584 +#line 2649 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2583 +#line 2648 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2586 +#line 2651 .species = SPECIES_HORSEA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2588 +#line 2653 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2587 +#line 2652 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2590 +#line 2655 [TRAINER_MARK] = { -#line 2591 +#line 2656 .trainerName = _("MARK"), -#line 2592 +#line 2657 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2593 +#line 2658 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2595 +#line 2660 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2596 +#line 2661 .doubleBattle = FALSE, -#line 2597 +#line 2662 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2599 +#line 2664 .species = SPECIES_RHYHORN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2601 +#line 2666 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2600 +#line 2665 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2603 +#line 2668 [TRAINER_GRUNT_MT_CHIMNEY_1] = { -#line 2604 +#line 2669 .trainerName = _("GRUNT"), -#line 2605 +#line 2670 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2606 +#line 2671 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, .encounterMusic_gender = -#line 2607 +#line 2672 F_TRAINER_FEMALE | -#line 2608 +#line 2673 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2609 +#line 2674 .doubleBattle = FALSE, -#line 2610 +#line 2675 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2612 +#line 2677 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2614 +#line 2679 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2613 +#line 2678 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2616 +#line 2681 [TRAINER_STEVE_2] = { -#line 2617 +#line 2682 .trainerName = _("STEVE"), -#line 2618 +#line 2683 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2619 +#line 2684 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2621 +#line 2686 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2622 +#line 2687 .doubleBattle = FALSE, -#line 2623 +#line 2688 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2625 +#line 2690 .species = SPECIES_LAIRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2627 +#line 2692 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2626 +#line 2691 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2629 +#line 2694 [TRAINER_STEVE_3] = { -#line 2630 +#line 2695 .trainerName = _("STEVE"), -#line 2631 +#line 2696 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2632 +#line 2697 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2634 +#line 2699 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2635 +#line 2700 .doubleBattle = FALSE, -#line 2636 +#line 2701 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2638 +#line 2703 .species = SPECIES_LAIRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2640 +#line 2705 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2639 +#line 2704 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2642 +#line 2707 .species = SPECIES_RHYHORN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2644 +#line 2709 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2643 +#line 2708 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2646 +#line 2711 [TRAINER_STEVE_4] = { -#line 2647 +#line 2712 .trainerName = _("STEVE"), -#line 2648 +#line 2713 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2649 +#line 2714 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2651 +#line 2716 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2652 +#line 2717 .doubleBattle = FALSE, -#line 2653 +#line 2718 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2655 +#line 2720 .species = SPECIES_LAIRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2657 +#line 2722 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2656 +#line 2721 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2659 +#line 2724 .species = SPECIES_RHYHORN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2661 +#line 2726 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2660 +#line 2725 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2663 +#line 2728 [TRAINER_STEVE_5] = { -#line 2664 +#line 2729 .trainerName = _("STEVE"), -#line 2665 +#line 2730 .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2666 +#line 2731 .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 2668 +#line 2733 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2669 +#line 2734 .doubleBattle = FALSE, -#line 2670 +#line 2735 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2672 +#line 2737 .species = SPECIES_AGGRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2674 +#line 2739 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2673 +#line 2738 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2676 +#line 2741 .species = SPECIES_RHYDON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2678 +#line 2743 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2677 +#line 2742 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2680 +#line 2745 [TRAINER_LUIS] = { -#line 2681 +#line 2746 .trainerName = _("LUIS"), -#line 2682 +#line 2747 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2683 +#line 2748 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2685 +#line 2750 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2686 +#line 2751 .doubleBattle = FALSE, -#line 2687 +#line 2752 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2689 +#line 2754 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2691 +#line 2756 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2690 +#line 2755 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2693 +#line 2758 [TRAINER_DOMINIK] = { -#line 2694 +#line 2759 .trainerName = _("DOMINIK"), -#line 2695 +#line 2760 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2696 +#line 2761 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2698 +#line 2763 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2699 +#line 2764 .doubleBattle = FALSE, -#line 2700 +#line 2765 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2702 +#line 2767 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2704 +#line 2769 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2703 +#line 2768 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2706 +#line 2771 [TRAINER_DOUGLAS] = { -#line 2707 +#line 2772 .trainerName = _("DOUGLAS"), -#line 2708 +#line 2773 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2709 +#line 2774 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2711 +#line 2776 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2712 +#line 2777 .doubleBattle = FALSE, -#line 2713 +#line 2778 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2715 +#line 2780 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2717 +#line 2782 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2716 +#line 2781 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2719 +#line 2784 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2721 +#line 2786 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2720 +#line 2785 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2723 +#line 2788 [TRAINER_DARRIN] = { -#line 2724 +#line 2789 .trainerName = _("DARRIN"), -#line 2725 +#line 2790 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2726 +#line 2791 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2728 +#line 2793 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2729 +#line 2794 .doubleBattle = FALSE, -#line 2730 +#line 2795 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 2732 +#line 2797 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2734 +#line 2799 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2733 +#line 2798 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2736 +#line 2801 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2738 +#line 2803 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2737 +#line 2802 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2740 +#line 2805 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2742 +#line 2807 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2741 +#line 2806 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2744 +#line 2809 [TRAINER_TONY_1] = { -#line 2745 +#line 2810 .trainerName = _("TONY"), -#line 2746 +#line 2811 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2747 +#line 2812 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2749 +#line 2814 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2750 +#line 2815 .doubleBattle = FALSE, -#line 2751 +#line 2816 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2753 +#line 2818 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2755 +#line 2820 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2754 +#line 2819 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2757 +#line 2822 [TRAINER_JEROME] = { -#line 2758 +#line 2823 .trainerName = _("JEROME"), -#line 2759 +#line 2824 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2760 +#line 2825 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2762 +#line 2827 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2763 +#line 2828 .doubleBattle = FALSE, -#line 2764 +#line 2829 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2766 +#line 2831 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2768 +#line 2833 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2767 +#line 2832 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2770 +#line 2835 [TRAINER_MATTHEW] = { -#line 2771 +#line 2836 .trainerName = _("MATTHEW"), -#line 2772 +#line 2837 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2773 +#line 2838 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2775 +#line 2840 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2776 +#line 2841 .doubleBattle = FALSE, -#line 2777 +#line 2842 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 2779 +#line 2844 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2781 +#line 2846 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2780 +#line 2845 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2783 +#line 2848 [TRAINER_DAVID] = { -#line 2784 +#line 2849 .trainerName = _("DAVID"), -#line 2785 +#line 2850 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2786 +#line 2851 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2788 +#line 2853 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2789 +#line 2854 .doubleBattle = FALSE, -#line 2790 +#line 2855 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2792 +#line 2857 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2794 +#line 2859 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2793 +#line 2858 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 2796 +#line 2861 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2798 +#line 2863 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2797 +#line 2862 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 2800 +#line 2865 [TRAINER_SPENCER] = { -#line 2801 +#line 2866 .trainerName = _("SPENCER"), -#line 2802 +#line 2867 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2803 +#line 2868 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 2805 +#line 2870 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2806 +#line 2871 .doubleBattle = FALSE, -#line 2807 +#line 2872 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 2809 +#line 2874 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2811 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2810 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2813 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2815 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2814 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2817 - [TRAINER_ROLAND] = - { -#line 2818 - .trainerName = _("ROLAND"), -#line 2819 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2820 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2822 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2823 - .doubleBattle = FALSE, -#line 2824 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2826 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2828 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2827 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2830 - [TRAINER_NOLEN] = - { -#line 2831 - .trainerName = _("NOLEN"), -#line 2832 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2833 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2835 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2836 - .doubleBattle = FALSE, -#line 2837 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2839 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2841 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2840 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2843 - [TRAINER_STAN] = - { -#line 2844 - .trainerName = _("STAN"), -#line 2845 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2846 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2848 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2849 - .doubleBattle = FALSE, -#line 2850 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2852 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2854 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2853 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2856 - [TRAINER_BARRY] = - { -#line 2857 - .trainerName = _("BARRY"), -#line 2858 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2859 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2861 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2862 - .doubleBattle = FALSE, -#line 2863 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2865 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2867 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2866 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2869 - [TRAINER_DEAN] = - { -#line 2870 - .trainerName = _("DEAN"), -#line 2871 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2872 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2874 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2875 - .doubleBattle = FALSE, #line 2876 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2875 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 2878 - .species = SPECIES_CARVANHA, + .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, #line 2880 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 2879 - .lvl = 31, + .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - { + }, + }, #line 2882 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2884 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + [TRAINER_ROLAND] = + { #line 2883 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, + .trainerName = _("ROLAND"), +#line 2884 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2885 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 2887 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2888 + .doubleBattle = FALSE, +#line 2889 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { { -#line 2886 +#line 2891 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 2888 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2887 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2890 - [TRAINER_RODNEY] = - { -#line 2891 - .trainerName = _("RODNEY"), -#line 2892 - .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 2893 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2892 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 2895 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [TRAINER_NOLEN] = + { #line 2896 - .doubleBattle = FALSE, + .trainerName = _("NOLEN"), #line 2897 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2899 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2901 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2898 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = #line 2900 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2903 - [TRAINER_RICHARD] = - { + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2901 + .doubleBattle = FALSE, +#line 2902 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { #line 2904 - .trainerName = _("RICHARD"), -#line 2905 - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .species = SPECIES_TENTACRUEL, + .gender = TRAINER_MON_RANDOM_GENDER, #line 2906 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2905 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 2908 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [TRAINER_STAN] = + { #line 2909 - .doubleBattle = FALSE, + .trainerName = _("STAN"), #line 2910 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2912 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2914 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2911 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = #line 2913 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2916 - [TRAINER_HERMAN] = - { + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2914 + .doubleBattle = FALSE, +#line 2915 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { #line 2917 - .trainerName = _("HERMAN"), -#line 2918 - .trainerClass = TRAINER_CLASS_SWIMMER_M, + .species = SPECIES_HORSEA, + .gender = TRAINER_MON_RANDOM_GENDER, #line 2919 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2918 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 2921 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, + [TRAINER_BARRY] = + { #line 2922 - .doubleBattle = FALSE, + .trainerName = _("BARRY"), #line 2923 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2925 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2927 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2924 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = #line 2926 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2927 + .doubleBattle = FALSE, +#line 2928 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { { -#line 2929 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2931 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 2930 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2933 - [TRAINER_SANTIAGO] = - { -#line 2934 - .trainerName = _("SANTIAGO"), -#line 2935 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2936 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2938 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2939 - .doubleBattle = FALSE, -#line 2940 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2942 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2944 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2943 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2946 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2948 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2947 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2950 - [TRAINER_GILBERT] = - { -#line 2951 - .trainerName = _("GILBERT"), -#line 2952 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2953 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2955 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2956 - .doubleBattle = FALSE, -#line 2957 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2959 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2961 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2960 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2963 - [TRAINER_FRANKLIN] = - { -#line 2964 - .trainerName = _("FRANKLIN"), -#line 2965 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2966 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2968 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2969 - .doubleBattle = FALSE, -#line 2970 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2972 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2974 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2973 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2976 - [TRAINER_KEVIN] = - { -#line 2977 - .trainerName = _("KEVIN"), -#line 2978 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2979 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2981 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2982 - .doubleBattle = FALSE, -#line 2983 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2985 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2987 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2986 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2989 - [TRAINER_JACK] = - { -#line 2990 - .trainerName = _("JACK"), -#line 2991 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2992 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2994 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2995 - .doubleBattle = FALSE, -#line 2996 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2998 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3000 +#line 2932 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2999 +#line 2931 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3002 - [TRAINER_DUDLEY] = +#line 2934 + [TRAINER_DEAN] = { -#line 3003 - .trainerName = _("DUDLEY"), -#line 3004 +#line 2935 + .trainerName = _("DEAN"), +#line 2936 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3005 +#line 2937 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 3007 +#line 2939 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3008 +#line 2940 .doubleBattle = FALSE, -#line 3009 +#line 2941 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { +#line 2943 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2945 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2944 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 2947 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2949 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2948 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 2951 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2953 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2952 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 2955 + [TRAINER_RODNEY] = + { +#line 2956 + .trainerName = _("RODNEY"), +#line 2957 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2958 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 2960 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2961 + .doubleBattle = FALSE, +#line 2962 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 2964 + .species = SPECIES_GYARADOS, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2966 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2965 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 2968 + [TRAINER_RICHARD] = + { +#line 2969 + .trainerName = _("RICHARD"), +#line 2970 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2971 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 2973 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2974 + .doubleBattle = FALSE, +#line 2975 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 2977 + .species = SPECIES_PELIPPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2979 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2978 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 2981 + [TRAINER_HERMAN] = + { +#line 2982 + .trainerName = _("HERMAN"), +#line 2983 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 2984 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 2986 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 2987 + .doubleBattle = FALSE, +#line 2988 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 2990 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2992 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2991 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 2994 + .species = SPECIES_TENTACRUEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 2996 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 2995 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 2998 + [TRAINER_SANTIAGO] = + { +#line 2999 + .trainerName = _("SANTIAGO"), +#line 3000 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3001 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3003 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3004 + .doubleBattle = FALSE, +#line 3005 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 3007 + .species = SPECIES_TENTACRUEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3009 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3008 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 3011 - .species = SPECIES_TENTACOOL, + .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, #line 3013 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -7573,739 +7413,899 @@ F_TRAINER_FEMALE | .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - { + }, + }, #line 3015 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3017 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + [TRAINER_GILBERT] = + { #line 3016 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3019 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3021 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .trainerName = _("GILBERT"), +#line 3017 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3018 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = #line 3020 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3023 - [TRAINER_CHAD] = - { -#line 3024 - .trainerName = _("CHAD"), -#line 3025 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3026 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3028 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3029 +#line 3021 .doubleBattle = FALSE, -#line 3030 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3032 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3034 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3033 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3036 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3038 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3037 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3040 - [TRAINER_TONY_2] = - { -#line 3041 - .trainerName = _("TONY"), -#line 3042 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3043 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3045 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3046 - .doubleBattle = FALSE, -#line 3047 +#line 3022 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3049 +#line 3024 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3051 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 3026 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3025 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3028 + [TRAINER_FRANKLIN] = + { +#line 3029 + .trainerName = _("FRANKLIN"), +#line 3030 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3031 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3033 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3034 + .doubleBattle = FALSE, +#line 3035 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 3037 + .species = SPECIES_SEALEO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3039 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3038 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3041 + [TRAINER_KEVIN] = + { +#line 3042 + .trainerName = _("KEVIN"), +#line 3043 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3044 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3046 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3047 + .doubleBattle = FALSE, +#line 3048 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { #line 3050 + .species = SPECIES_SPHEAL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3052 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3051 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3054 + [TRAINER_JACK] = + { +#line 3055 + .trainerName = _("JACK"), +#line 3056 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3057 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3059 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3060 + .doubleBattle = FALSE, +#line 3061 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 3063 + .species = SPECIES_GYARADOS, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3065 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3064 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3067 + [TRAINER_DUDLEY] = + { +#line 3068 + .trainerName = _("DUDLEY"), +#line 3069 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3070 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3072 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3073 + .doubleBattle = FALSE, +#line 3074 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 3076 + .species = SPECIES_TENTACOOL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3078 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3077 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 3080 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3082 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3081 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 3084 + .species = SPECIES_TENTACRUEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3086 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3085 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3088 + [TRAINER_CHAD] = + { +#line 3089 + .trainerName = _("CHAD"), +#line 3090 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3091 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3093 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3094 + .doubleBattle = FALSE, +#line 3095 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 3097 + .species = SPECIES_TENTACOOL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3099 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3098 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 3101 + .species = SPECIES_WAILMER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3103 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 3102 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 3105 + [TRAINER_TONY_2] = + { +#line 3106 + .trainerName = _("TONY"), +#line 3107 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 3108 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 3110 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 3111 + .doubleBattle = FALSE, +#line 3112 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 3114 + .species = SPECIES_SHARPEDO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 3116 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 3115 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3053 +#line 3118 [TRAINER_TONY_3] = { -#line 3054 +#line 3119 .trainerName = _("TONY"), -#line 3055 +#line 3120 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3056 +#line 3121 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 3058 +#line 3123 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3059 +#line 3124 .doubleBattle = FALSE, -#line 3060 +#line 3125 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3062 +#line 3127 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3064 +#line 3129 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3063 +#line 3128 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3066 +#line 3131 [TRAINER_TONY_4] = { -#line 3067 +#line 3132 .trainerName = _("TONY"), -#line 3068 +#line 3133 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3069 +#line 3134 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 3071 +#line 3136 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3072 +#line 3137 .doubleBattle = FALSE, -#line 3073 +#line 3138 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3075 +#line 3140 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3077 +#line 3142 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3076 +#line 3141 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3079 +#line 3144 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3081 +#line 3146 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3080 +#line 3145 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3083 +#line 3148 [TRAINER_TONY_5] = { -#line 3084 +#line 3149 .trainerName = _("TONY"), -#line 3085 +#line 3150 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3086 +#line 3151 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 3088 +#line 3153 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3089 +#line 3154 .doubleBattle = FALSE, -#line 3090 +#line 3155 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3092 +#line 3157 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3094 +#line 3159 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3093 +#line 3158 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3096 +#line 3161 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3098 +#line 3163 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3097 +#line 3162 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3100 +#line 3165 [TRAINER_TAKAO] = { -#line 3101 +#line 3166 .trainerName = _("TAKAO"), -#line 3102 +#line 3167 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3103 +#line 3168 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3105 +#line 3170 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3106 +#line 3171 .doubleBattle = FALSE, -#line 3107 +#line 3172 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3109 +#line 3174 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3111 +#line 3176 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3110 +#line 3175 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3113 +#line 3178 [TRAINER_HITOSHI] = { -#line 3114 +#line 3179 .trainerName = _("HITOSHI"), -#line 3115 +#line 3180 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3116 +#line 3181 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3118 +#line 3183 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3119 +#line 3184 .doubleBattle = FALSE, -#line 3120 +#line 3185 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3122 +#line 3187 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3124 +#line 3189 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 3123 +#line 3188 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3126 +#line 3191 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3128 +#line 3193 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 3127 +#line 3192 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3130 +#line 3195 [TRAINER_KIYO] = { -#line 3131 +#line 3196 .trainerName = _("KIYO"), -#line 3132 +#line 3197 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3133 +#line 3198 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3135 +#line 3200 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3136 +#line 3201 .doubleBattle = FALSE, -#line 3137 +#line 3202 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3139 +#line 3204 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3141 +#line 3206 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3140 +#line 3205 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3143 +#line 3208 [TRAINER_KOICHI] = { -#line 3144 +#line 3209 .trainerName = _("KOICHI"), -#line 3145 +#line 3210 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3146 +#line 3211 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3148 +#line 3213 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3149 +#line 3214 .doubleBattle = FALSE, -#line 3150 +#line 3215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3152 +#line 3217 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3154 +#line 3219 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3153 +#line 3218 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3156 +#line 3221 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3158 +#line 3223 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3157 +#line 3222 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3160 +#line 3225 [TRAINER_NOB_1] = { -#line 3161 +#line 3226 .trainerName = _("NOB"), -#line 3162 +#line 3227 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3163 +#line 3228 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3165 +#line 3230 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3166 +#line 3231 .doubleBattle = FALSE, -#line 3167 +#line 3232 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3169 +#line 3234 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3171 +#line 3236 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3170 +#line 3235 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3173 +#line 3238 [TRAINER_NOB_2] = { -#line 3174 +#line 3239 .trainerName = _("NOB"), -#line 3175 +#line 3240 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3176 +#line 3241 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3178 +#line 3243 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3179 +#line 3244 .doubleBattle = FALSE, -#line 3180 +#line 3245 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3182 +#line 3247 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3184 +#line 3249 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 3183 +#line 3248 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3186 +#line 3251 [TRAINER_NOB_3] = { -#line 3187 +#line 3252 .trainerName = _("NOB"), -#line 3188 +#line 3253 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3189 +#line 3254 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3191 +#line 3256 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3192 +#line 3257 .doubleBattle = FALSE, -#line 3193 +#line 3258 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3195 +#line 3260 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3197 +#line 3262 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3196 +#line 3261 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3199 +#line 3264 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3201 +#line 3266 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3200 +#line 3265 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3203 +#line 3268 [TRAINER_NOB_4] = { -#line 3204 +#line 3269 .trainerName = _("NOB"), -#line 3205 +#line 3270 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3206 +#line 3271 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3208 +#line 3273 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3209 +#line 3274 .doubleBattle = FALSE, -#line 3210 +#line 3275 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3212 +#line 3277 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3214 +#line 3279 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3213 +#line 3278 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3216 +#line 3281 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3218 +#line 3283 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3217 +#line 3282 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3220 +#line 3285 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3222 +#line 3287 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3221 +#line 3286 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3224 +#line 3289 [TRAINER_NOB_5] = { -#line 3225 +#line 3290 .trainerName = _("NOB"), -#line 3226 +#line 3291 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3227 +#line 3292 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3229 +#line 3294 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3230 +#line 3295 .doubleBattle = FALSE, -#line 3231 +#line 3296 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 3233 +#line 3298 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3235 +#line 3300 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3234 +#line 3299 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3237 +#line 3302 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3239 +#line 3304 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3238 +#line 3303 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3241 +#line 3306 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3243 +#line 3308 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3242 +#line 3307 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3245 +#line 3310 .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3245 +#line 3310 .heldItem = ITEM_BLACK_BELT, -#line 3247 +#line 3312 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3246 +#line 3311 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3249 +#line 3314 [TRAINER_YUJI] = { -#line 3250 +#line 3315 .trainerName = _("YUJI"), -#line 3251 +#line 3316 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3252 +#line 3317 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3254 +#line 3319 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3255 +#line 3320 .doubleBattle = FALSE, -#line 3256 +#line 3321 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3258 +#line 3323 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3260 +#line 3325 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3259 +#line 3324 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3262 +#line 3327 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3264 +#line 3329 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3263 +#line 3328 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3266 +#line 3331 [TRAINER_DAISUKE] = { -#line 3267 +#line 3332 .trainerName = _("DAISUKE"), -#line 3268 +#line 3333 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3269 +#line 3334 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3271 +#line 3336 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3272 +#line 3337 .doubleBattle = FALSE, -#line 3273 +#line 3338 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3275 +#line 3340 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3277 +#line 3342 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3276 +#line 3341 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3279 +#line 3344 [TRAINER_ATSUSHI] = { -#line 3280 +#line 3345 .trainerName = _("ATSUSHI"), -#line 3281 +#line 3346 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3282 +#line 3347 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 3284 +#line 3349 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3285 +#line 3350 .doubleBattle = FALSE, -#line 3286 +#line 3351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3288 +#line 3353 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3290 +#line 3355 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3289 +#line 3354 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3292 +#line 3357 [TRAINER_KIRK] = { -#line 3293 +#line 3358 .trainerName = _("KIRK"), -#line 3294 +#line 3359 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3295 +#line 3360 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3297 +#line 3362 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3298 +#line 3363 .doubleBattle = FALSE, -#line 3299 +#line 3364 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3301 +#line 3366 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3303 +#line 3368 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3302 +#line 3367 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3304 +#line 3369 MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SPARK, @@ -8313,17 +8313,17 @@ F_TRAINER_FEMALE | }, }, { -#line 3309 +#line 3374 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3311 +#line 3376 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3310 +#line 3375 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3312 +#line 3377 MOVE_CHARGE, MOVE_SHOCK_WAVE, MOVE_SCREECH, @@ -8331,845 +8331,845 @@ F_TRAINER_FEMALE | }, }, }, -#line 3316 +#line 3381 [TRAINER_GRUNT_AQUA_HIDEOUT_7] = { -#line 3317 +#line 3382 .trainerName = _("GRUNT"), -#line 3318 +#line 3383 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3319 +#line 3384 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 3320 +#line 3385 F_TRAINER_FEMALE | -#line 3321 +#line 3386 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3322 +#line 3387 .doubleBattle = FALSE, -#line 3323 +#line 3388 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3325 +#line 3390 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3327 +#line 3392 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3326 +#line 3391 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3329 +#line 3394 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3331 +#line 3396 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3330 +#line 3395 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3333 +#line 3398 [TRAINER_GRUNT_AQUA_HIDEOUT_8] = { -#line 3334 +#line 3399 .trainerName = _("GRUNT"), -#line 3335 +#line 3400 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3336 +#line 3401 .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, .encounterMusic_gender = -#line 3338 +#line 3403 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3339 +#line 3404 .doubleBattle = FALSE, -#line 3340 +#line 3405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3342 +#line 3407 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3344 +#line 3409 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3343 +#line 3408 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3346 +#line 3411 [TRAINER_SHAWN] = { -#line 3347 +#line 3412 .trainerName = _("SHAWN"), -#line 3348 +#line 3413 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3349 +#line 3414 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3351 +#line 3416 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3352 +#line 3417 .doubleBattle = FALSE, -#line 3353 +#line 3418 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3355 +#line 3420 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3357 +#line 3422 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3356 +#line 3421 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3359 +#line 3424 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3361 +#line 3426 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3360 +#line 3425 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3363 +#line 3428 [TRAINER_FERNANDO_1] = { -#line 3364 +#line 3429 .trainerName = _("FERNANDO"), -#line 3365 +#line 3430 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3366 +#line 3431 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3368 +#line 3433 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3369 +#line 3434 .doubleBattle = FALSE, -#line 3370 +#line 3435 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3372 +#line 3437 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3374 +#line 3439 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3373 +#line 3438 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3376 +#line 3441 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3378 +#line 3443 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3377 +#line 3442 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3380 +#line 3445 [TRAINER_DALTON_1] = { -#line 3381 +#line 3446 .trainerName = _("DALTON"), -#line 3382 +#line 3447 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3383 +#line 3448 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3385 +#line 3450 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3386 +#line 3451 .doubleBattle = FALSE, -#line 3387 +#line 3452 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3389 +#line 3454 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3391 +#line 3456 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3390 +#line 3455 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3393 +#line 3458 .species = SPECIES_WHISMUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3395 +#line 3460 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3394 +#line 3459 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3397 +#line 3462 [TRAINER_DALTON_2] = { -#line 3398 +#line 3463 .trainerName = _("DALTON"), -#line 3399 +#line 3464 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3400 +#line 3465 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3402 +#line 3467 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3403 +#line 3468 .doubleBattle = FALSE, -#line 3404 +#line 3469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3406 +#line 3471 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3408 +#line 3473 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3407 +#line 3472 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3410 +#line 3475 .species = SPECIES_WHISMUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3412 +#line 3477 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3411 +#line 3476 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3414 +#line 3479 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3416 +#line 3481 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3415 +#line 3480 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3418 +#line 3483 [TRAINER_DALTON_3] = { -#line 3419 +#line 3484 .trainerName = _("DALTON"), -#line 3420 +#line 3485 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3421 +#line 3486 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3423 +#line 3488 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3424 +#line 3489 .doubleBattle = FALSE, -#line 3425 +#line 3490 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3427 +#line 3492 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3429 +#line 3494 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3428 +#line 3493 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3431 +#line 3496 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3433 +#line 3498 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3432 +#line 3497 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3435 +#line 3500 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3437 +#line 3502 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3436 +#line 3501 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3439 +#line 3504 [TRAINER_DALTON_4] = { -#line 3440 +#line 3505 .trainerName = _("DALTON"), -#line 3441 +#line 3506 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3442 +#line 3507 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3444 +#line 3509 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3445 +#line 3510 .doubleBattle = FALSE, -#line 3446 +#line 3511 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3448 +#line 3513 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3450 +#line 3515 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3449 +#line 3514 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3452 +#line 3517 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3454 +#line 3519 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3453 +#line 3518 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3456 +#line 3521 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3458 +#line 3523 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3457 +#line 3522 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3460 +#line 3525 [TRAINER_DALTON_5] = { -#line 3461 +#line 3526 .trainerName = _("DALTON"), -#line 3462 +#line 3527 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3463 +#line 3528 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 3465 +#line 3530 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3466 +#line 3531 .doubleBattle = FALSE, -#line 3467 +#line 3532 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3469 +#line 3534 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3471 +#line 3536 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3470 +#line 3535 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3473 +#line 3538 .species = SPECIES_EXPLOUD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3475 +#line 3540 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3474 +#line 3539 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3477 +#line 3542 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3479 +#line 3544 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3478 +#line 3543 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3481 +#line 3546 [TRAINER_COLE] = { -#line 3482 +#line 3547 .trainerName = _("COLE"), -#line 3483 +#line 3548 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3484 +#line 3549 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3486 +#line 3551 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3487 +#line 3552 .doubleBattle = FALSE, -#line 3488 +#line 3553 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3490 +#line 3555 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3492 +#line 3557 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3491 +#line 3556 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3494 +#line 3559 [TRAINER_JEFF] = { -#line 3495 +#line 3560 .trainerName = _("JEFF"), -#line 3496 +#line 3561 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3497 +#line 3562 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3499 +#line 3564 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3500 +#line 3565 .doubleBattle = FALSE, -#line 3501 +#line 3566 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3503 +#line 3568 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3505 +#line 3570 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3504 +#line 3569 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3507 +#line 3572 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3509 +#line 3574 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3508 +#line 3573 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3511 +#line 3576 [TRAINER_AXLE] = { -#line 3512 +#line 3577 .trainerName = _("AXLE"), -#line 3513 +#line 3578 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3514 +#line 3579 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3516 +#line 3581 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3517 +#line 3582 .doubleBattle = FALSE, -#line 3518 +#line 3583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3520 +#line 3585 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3522 +#line 3587 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3521 +#line 3586 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3524 +#line 3589 [TRAINER_JACE] = { -#line 3525 +#line 3590 .trainerName = _("JACE"), -#line 3526 +#line 3591 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3527 +#line 3592 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3529 +#line 3594 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3530 +#line 3595 .doubleBattle = FALSE, -#line 3531 +#line 3596 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3533 +#line 3598 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3535 +#line 3600 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3534 +#line 3599 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3537 +#line 3602 [TRAINER_KEEGAN] = { -#line 3538 +#line 3603 .trainerName = _("KEEGAN"), -#line 3539 +#line 3604 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3540 +#line 3605 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3542 +#line 3607 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3543 +#line 3608 .doubleBattle = FALSE, -#line 3544 +#line 3609 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3546 +#line 3611 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3548 +#line 3613 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3547 +#line 3612 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3550 +#line 3615 [TRAINER_BERNIE_1] = { -#line 3551 +#line 3616 .trainerName = _("BERNIE"), -#line 3552 +#line 3617 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3553 +#line 3618 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3555 +#line 3620 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3556 +#line 3621 .doubleBattle = FALSE, -#line 3557 +#line 3622 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3559 +#line 3624 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3561 +#line 3626 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3560 +#line 3625 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3563 +#line 3628 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3565 +#line 3630 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3564 +#line 3629 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3567 +#line 3632 [TRAINER_BERNIE_2] = { -#line 3568 +#line 3633 .trainerName = _("BERNIE"), -#line 3569 +#line 3634 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3570 +#line 3635 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3572 +#line 3637 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3573 +#line 3638 .doubleBattle = FALSE, -#line 3574 +#line 3639 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3576 +#line 3641 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3578 +#line 3643 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3577 +#line 3642 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3580 +#line 3645 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3582 +#line 3647 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3581 +#line 3646 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3584 +#line 3649 [TRAINER_BERNIE_3] = { -#line 3585 +#line 3650 .trainerName = _("BERNIE"), -#line 3586 +#line 3651 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3587 +#line 3652 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3589 +#line 3654 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3590 +#line 3655 .doubleBattle = FALSE, -#line 3591 +#line 3656 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3593 +#line 3658 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3595 +#line 3660 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3594 +#line 3659 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3597 +#line 3662 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3599 +#line 3664 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3598 +#line 3663 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3601 +#line 3666 [TRAINER_BERNIE_4] = { -#line 3602 +#line 3667 .trainerName = _("BERNIE"), -#line 3603 +#line 3668 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3604 +#line 3669 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3606 +#line 3671 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3607 +#line 3672 .doubleBattle = FALSE, -#line 3608 +#line 3673 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3610 +#line 3675 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3612 +#line 3677 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3611 +#line 3676 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3614 +#line 3679 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3616 +#line 3681 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3615 +#line 3680 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3618 +#line 3683 [TRAINER_BERNIE_5] = { -#line 3619 +#line 3684 .trainerName = _("BERNIE"), -#line 3620 +#line 3685 .trainerClass = TRAINER_CLASS_KINDLER, -#line 3621 +#line 3686 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 3623 +#line 3688 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3624 +#line 3689 .doubleBattle = FALSE, -#line 3625 +#line 3690 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3627 +#line 3692 .species = SPECIES_MAGCARGO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3629 +#line 3694 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3628 +#line 3693 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3631 +#line 3696 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3633 +#line 3698 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3632 +#line 3697 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3635 +#line 3700 [TRAINER_DREW] = { -#line 3636 +#line 3701 .trainerName = _("DREW"), -#line 3637 +#line 3702 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3638 +#line 3703 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3640 +#line 3705 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3641 +#line 3706 .doubleBattle = FALSE, -#line 3642 +#line 3707 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3644 +#line 3709 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3646 +#line 3711 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3645 +#line 3710 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3647 +#line 3712 MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, @@ -9178,37 +9178,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 3652 +#line 3717 [TRAINER_BEAU] = { -#line 3653 +#line 3718 .trainerName = _("BEAU"), -#line 3654 +#line 3719 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3655 +#line 3720 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3657 +#line 3722 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3658 +#line 3723 .doubleBattle = FALSE, -#line 3659 +#line 3724 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3661 +#line 3726 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3663 +#line 3728 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3662 +#line 3727 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3664 +#line 3729 MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, @@ -9216,17 +9216,17 @@ F_TRAINER_FEMALE | }, }, { -#line 3669 +#line 3734 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3671 +#line 3736 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3670 +#line 3735 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3672 +#line 3737 MOVE_POISON_STING, MOVE_SAND_ATTACK, MOVE_SCRATCH, @@ -9234,17 +9234,17 @@ F_TRAINER_FEMALE | }, }, { -#line 3677 +#line 3742 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3679 +#line 3744 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3678 +#line 3743 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 3680 +#line 3745 MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, @@ -9253,1973 +9253,1973 @@ F_TRAINER_FEMALE | }, }, }, -#line 3685 +#line 3750 [TRAINER_LARRY] = { -#line 3686 +#line 3751 .trainerName = _("LARRY"), -#line 3687 +#line 3752 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3688 +#line 3753 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3690 +#line 3755 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3691 +#line 3756 .doubleBattle = FALSE, -#line 3692 +#line 3757 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3694 +#line 3759 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3696 +#line 3761 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3695 +#line 3760 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3698 +#line 3763 [TRAINER_SHANE] = { -#line 3699 +#line 3764 .trainerName = _("SHANE"), -#line 3700 +#line 3765 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3701 +#line 3766 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3703 +#line 3768 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3704 +#line 3769 .doubleBattle = FALSE, -#line 3705 +#line 3770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3707 +#line 3772 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3709 +#line 3774 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3708 +#line 3773 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3711 +#line 3776 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3713 +#line 3778 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3712 +#line 3777 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3715 +#line 3780 [TRAINER_JUSTIN] = { -#line 3716 +#line 3781 .trainerName = _("JUSTIN"), -#line 3717 +#line 3782 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3718 +#line 3783 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3720 +#line 3785 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3721 +#line 3786 .doubleBattle = FALSE, -#line 3722 +#line 3787 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3724 +#line 3789 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3726 +#line 3791 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3725 +#line 3790 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3728 +#line 3793 [TRAINER_ETHAN_1] = { -#line 3729 +#line 3794 .trainerName = _("ETHAN"), -#line 3730 +#line 3795 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3731 +#line 3796 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3733 +#line 3798 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3734 +#line 3799 .doubleBattle = FALSE, -#line 3735 +#line 3800 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3737 +#line 3802 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3739 +#line 3804 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3738 +#line 3803 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3741 +#line 3806 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3743 +#line 3808 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3742 +#line 3807 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3745 +#line 3810 [TRAINER_AUTUMN] = { -#line 3746 +#line 3811 .trainerName = _("AUTUMN"), -#line 3747 +#line 3812 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 3748 +#line 3813 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 3749 +#line 3814 F_TRAINER_FEMALE | -#line 3750 +#line 3815 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 3751 +#line 3816 .doubleBattle = FALSE, -#line 3752 +#line 3817 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3754 +#line 3819 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3756 +#line 3821 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3755 +#line 3820 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3758 +#line 3823 [TRAINER_TRAVIS] = { -#line 3759 +#line 3824 .trainerName = _("TRAVIS"), -#line 3760 +#line 3825 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3761 +#line 3826 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3763 +#line 3828 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3764 +#line 3829 .doubleBattle = FALSE, -#line 3765 +#line 3830 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3767 +#line 3832 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3769 +#line 3834 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3768 +#line 3833 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3771 +#line 3836 [TRAINER_ETHAN_2] = { -#line 3772 +#line 3837 .trainerName = _("ETHAN"), -#line 3773 +#line 3838 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3774 +#line 3839 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3776 +#line 3841 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3777 +#line 3842 .doubleBattle = FALSE, -#line 3778 +#line 3843 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3780 +#line 3845 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3782 +#line 3847 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3781 +#line 3846 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3784 +#line 3849 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3786 +#line 3851 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3785 +#line 3850 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3788 +#line 3853 [TRAINER_ETHAN_3] = { -#line 3789 +#line 3854 .trainerName = _("ETHAN"), -#line 3790 +#line 3855 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3791 +#line 3856 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3793 +#line 3858 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3794 +#line 3859 .doubleBattle = FALSE, -#line 3795 +#line 3860 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3797 +#line 3862 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3799 +#line 3864 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3798 +#line 3863 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3801 +#line 3866 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3803 +#line 3868 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3802 +#line 3867 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3805 +#line 3870 [TRAINER_ETHAN_4] = { -#line 3806 +#line 3871 .trainerName = _("ETHAN"), -#line 3807 +#line 3872 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3808 +#line 3873 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3810 +#line 3875 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3811 +#line 3876 .doubleBattle = FALSE, -#line 3812 +#line 3877 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3814 +#line 3879 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3816 +#line 3881 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3815 +#line 3880 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3818 +#line 3883 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3820 +#line 3885 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3819 +#line 3884 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3822 +#line 3887 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3824 +#line 3889 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3823 +#line 3888 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3826 +#line 3891 [TRAINER_ETHAN_5] = { -#line 3827 +#line 3892 .trainerName = _("ETHAN"), -#line 3828 +#line 3893 .trainerClass = TRAINER_CLASS_CAMPER, -#line 3829 +#line 3894 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 3831 +#line 3896 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3832 +#line 3897 .doubleBattle = FALSE, -#line 3833 +#line 3898 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3835 +#line 3900 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3837 +#line 3902 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3836 +#line 3901 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3839 +#line 3904 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3841 +#line 3906 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3840 +#line 3905 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3843 +#line 3908 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3845 +#line 3910 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3844 +#line 3909 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3847 +#line 3912 [TRAINER_BRENT] = { -#line 3848 +#line 3913 .trainerName = _("BRENT"), -#line 3849 +#line 3914 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3850 +#line 3915 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3852 +#line 3917 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3853 +#line 3918 .doubleBattle = FALSE, -#line 3854 +#line 3919 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 3856 +#line 3921 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3858 +#line 3923 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3857 +#line 3922 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3860 +#line 3925 [TRAINER_DONALD] = { -#line 3861 +#line 3926 .trainerName = _("DONALD"), -#line 3862 +#line 3927 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3863 +#line 3928 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3865 +#line 3930 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3866 +#line 3931 .doubleBattle = FALSE, -#line 3867 +#line 3932 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3869 +#line 3934 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3871 +#line 3936 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3870 +#line 3935 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3873 +#line 3938 .species = SPECIES_SILCOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3875 +#line 3940 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3874 +#line 3939 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3877 +#line 3942 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3879 +#line 3944 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3878 +#line 3943 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3881 +#line 3946 [TRAINER_TAYLOR] = { -#line 3882 +#line 3947 .trainerName = _("TAYLOR"), -#line 3883 +#line 3948 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3884 +#line 3949 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3886 +#line 3951 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3887 +#line 3952 .doubleBattle = FALSE, -#line 3888 +#line 3953 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3890 +#line 3955 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3892 +#line 3957 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3891 +#line 3956 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3894 +#line 3959 .species = SPECIES_CASCOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3896 +#line 3961 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3895 +#line 3960 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3898 +#line 3963 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3900 +#line 3965 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3899 +#line 3964 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3902 +#line 3967 [TRAINER_JEFFREY_1] = { -#line 3903 +#line 3968 .trainerName = _("JEFFREY"), -#line 3904 +#line 3969 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3905 +#line 3970 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3907 +#line 3972 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3908 +#line 3973 .doubleBattle = FALSE, -#line 3909 +#line 3974 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3911 +#line 3976 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3913 +#line 3978 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3912 +#line 3977 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3915 +#line 3980 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3917 +#line 3982 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3916 +#line 3981 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3919 +#line 3984 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3921 +#line 3986 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3920 +#line 3985 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3923 +#line 3988 [TRAINER_DEREK] = { -#line 3924 +#line 3989 .trainerName = _("DEREK"), -#line 3925 +#line 3990 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3926 +#line 3991 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3928 +#line 3993 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3929 +#line 3994 .doubleBattle = FALSE, -#line 3930 +#line 3995 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 3932 +#line 3997 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3934 +#line 3999 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3933 +#line 3998 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3936 +#line 4001 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3938 +#line 4003 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3937 +#line 4002 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3940 +#line 4005 [TRAINER_JEFFREY_2] = { -#line 3941 +#line 4006 .trainerName = _("JEFFREY"), -#line 3942 +#line 4007 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3943 +#line 4008 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3945 +#line 4010 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3946 +#line 4011 .doubleBattle = FALSE, -#line 3947 +#line 4012 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3949 +#line 4014 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3951 +#line 4016 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3950 +#line 4015 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3953 +#line 4018 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3955 +#line 4020 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3954 +#line 4019 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3957 +#line 4022 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3959 +#line 4024 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3958 +#line 4023 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3961 +#line 4026 [TRAINER_JEFFREY_3] = { -#line 3962 +#line 4027 .trainerName = _("JEFFREY"), -#line 3963 +#line 4028 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3964 +#line 4029 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3966 +#line 4031 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3967 +#line 4032 .doubleBattle = FALSE, -#line 3968 +#line 4033 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 3970 +#line 4035 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3972 +#line 4037 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3971 +#line 4036 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3974 +#line 4039 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3976 +#line 4041 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3975 +#line 4040 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3978 +#line 4043 .species = SPECIES_MASQUERAIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3980 +#line 4045 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3979 +#line 4044 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 3982 +#line 4047 [TRAINER_JEFFREY_4] = { -#line 3983 +#line 4048 .trainerName = _("JEFFREY"), -#line 3984 +#line 4049 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3985 +#line 4050 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 3987 +#line 4052 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3988 +#line 4053 .doubleBattle = FALSE, -#line 3989 +#line 4054 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 3991 +#line 4056 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3993 +#line 4058 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3992 +#line 4057 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3995 +#line 4060 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 3997 +#line 4062 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3996 +#line 4061 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 3999 +#line 4064 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4001 +#line 4066 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4000 +#line 4065 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4003 +#line 4068 .species = SPECIES_MASQUERAIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4005 +#line 4070 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4004 +#line 4069 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4007 +#line 4072 [TRAINER_JEFFREY_5] = { -#line 4008 +#line 4073 .trainerName = _("JEFFREY"), -#line 4009 +#line 4074 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4010 +#line 4075 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 4012 +#line 4077 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4013 +#line 4078 .doubleBattle = FALSE, -#line 4014 +#line 4079 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4016 +#line 4081 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4018 +#line 4083 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4017 +#line 4082 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4020 +#line 4085 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4022 +#line 4087 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4021 +#line 4086 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4024 +#line 4089 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4026 +#line 4091 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4025 +#line 4090 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4028 +#line 4093 .species = SPECIES_MASQUERAIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4028 +#line 4093 .heldItem = ITEM_SILVER_POWDER, -#line 4030 +#line 4095 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4029 +#line 4094 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4032 +#line 4097 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4034 +#line 4099 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4033 +#line 4098 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4036 +#line 4101 [TRAINER_EDWARD] = { -#line 4037 +#line 4102 .trainerName = _("EDWARD"), -#line 4038 +#line 4103 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4039 +#line 4104 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4041 +#line 4106 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4042 +#line 4107 .doubleBattle = FALSE, -#line 4043 +#line 4108 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4045 +#line 4110 .species = SPECIES_ABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4047 +#line 4112 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4046 +#line 4111 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4048 +#line 4113 MOVE_HIDDEN_POWER, }, }, }, }, -#line 4050 +#line 4115 [TRAINER_PRESTON] = { -#line 4051 +#line 4116 .trainerName = _("PRESTON"), -#line 4052 +#line 4117 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4053 +#line 4118 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4055 +#line 4120 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4056 +#line 4121 .doubleBattle = FALSE, -#line 4057 +#line 4122 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4059 +#line 4124 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4061 +#line 4126 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4060 +#line 4125 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4063 +#line 4128 [TRAINER_VIRGIL] = { -#line 4064 +#line 4129 .trainerName = _("VIRGIL"), -#line 4065 +#line 4130 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4066 +#line 4131 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4068 +#line 4133 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4069 +#line 4134 .doubleBattle = FALSE, -#line 4070 +#line 4135 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4072 +#line 4137 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4074 +#line 4139 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4073 +#line 4138 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4076 +#line 4141 [TRAINER_BLAKE] = { -#line 4077 +#line 4142 .trainerName = _("BLAKE"), -#line 4078 +#line 4143 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4079 +#line 4144 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4081 +#line 4146 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4082 +#line 4147 .doubleBattle = FALSE, -#line 4083 +#line 4148 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4085 +#line 4150 .species = SPECIES_GIRAFARIG, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4087 +#line 4152 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4086 +#line 4151 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4089 +#line 4154 [TRAINER_WILLIAM] = { -#line 4090 +#line 4155 .trainerName = _("WILLIAM"), -#line 4091 +#line 4156 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4092 +#line 4157 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4094 +#line 4159 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4095 +#line 4160 .doubleBattle = FALSE, -#line 4096 +#line 4161 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 4098 +#line 4163 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4100 +#line 4165 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4099 +#line 4164 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4102 +#line 4167 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4104 +#line 4169 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4103 +#line 4168 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4106 +#line 4171 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4108 +#line 4173 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4107 +#line 4172 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4110 +#line 4175 [TRAINER_JOSHUA] = { -#line 4111 +#line 4176 .trainerName = _("JOSHUA"), -#line 4112 +#line 4177 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4113 +#line 4178 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4115 +#line 4180 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4116 +#line 4181 .doubleBattle = FALSE, -#line 4117 +#line 4182 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 4119 +#line 4184 .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4121 +#line 4186 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4120 +#line 4185 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4123 +#line 4188 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4125 +#line 4190 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4124 +#line 4189 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4127 +#line 4192 [TRAINER_CAMERON_1] = { -#line 4128 +#line 4193 .trainerName = _("CAMERON"), -#line 4129 +#line 4194 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4130 +#line 4195 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4132 +#line 4197 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4133 +#line 4198 .doubleBattle = FALSE, -#line 4134 +#line 4199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4136 +#line 4201 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4138 +#line 4203 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4137 +#line 4202 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4140 +#line 4205 [TRAINER_CAMERON_2] = { -#line 4141 - .trainerName = _("CAMERON"), -#line 4142 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4143 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4145 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4146 - .doubleBattle = FALSE, -#line 4147 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4149 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4151 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4150 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4153 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4155 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4154 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4157 - [TRAINER_CAMERON_3] = - { -#line 4158 - .trainerName = _("CAMERON"), -#line 4159 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4160 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4162 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4163 - .doubleBattle = FALSE, -#line 4164 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4166 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4168 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4167 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4170 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4172 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4171 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4174 - [TRAINER_CAMERON_4] = - { -#line 4175 - .trainerName = _("CAMERON"), -#line 4176 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4177 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4179 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4180 - .doubleBattle = FALSE, -#line 4181 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4183 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4185 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4184 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4187 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4189 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4188 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4191 - [TRAINER_CAMERON_5] = - { -#line 4192 - .trainerName = _("CAMERON"), -#line 4193 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4194 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4196 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4197 - .doubleBattle = FALSE, -#line 4198 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4200 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4202 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4201 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4204 - .species = SPECIES_ALAKAZAM, - .gender = TRAINER_MON_RANDOM_GENDER, #line 4206 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4205 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4208 - [TRAINER_JACLYN] = - { -#line 4209 - .trainerName = _("JACLYN"), -#line 4210 + .trainerName = _("CAMERON"), +#line 4207 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4211 - .trainerPic = TRAINER_PIC_PSYCHIC_F, +#line 4208 + .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4212 -F_TRAINER_FEMALE | -#line 4213 +#line 4210 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4214 +#line 4211 .doubleBattle = FALSE, -#line 4215 +#line 4212 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 4217 - .species = SPECIES_ABRA, +#line 4214 + .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4219 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4218 - .lvl = 16, +#line 4216 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 4215 + .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4220 - MOVE_HIDDEN_POWER, }, + { +#line 4218 + .species = SPECIES_SOLROCK, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4220 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 4219 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 4222 - [TRAINER_HANNAH] = + [TRAINER_CAMERON_3] = { #line 4223 - .trainerName = _("HANNAH"), + .trainerName = _("CAMERON"), #line 4224 .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4225 - .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 4226 -F_TRAINER_FEMALE | #line 4227 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4228 .doubleBattle = FALSE, #line 4229 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { #line 4231 - .species = SPECIES_KIRLIA, + .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, #line 4233 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), #line 4232 - .lvl = 36, + .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - }, - }, + { #line 4235 - [TRAINER_SAMANTHA] = - { -#line 4236 - .trainerName = _("SAMANTHA"), + .species = SPECIES_SOLROCK, + .gender = TRAINER_MON_RANDOM_GENDER, #line 4237 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4238 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 4236 + .lvl = 38, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 4239 -F_TRAINER_FEMALE | + [TRAINER_CAMERON_4] = + { #line 4240 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerName = _("CAMERON"), #line 4241 - .doubleBattle = FALSE, + .trainerClass = TRAINER_CLASS_PSYCHIC, #line 4242 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .encounterMusic_gender = #line 4244 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4246 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4245 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, + .doubleBattle = FALSE, +#line 4246 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { #line 4248 - [TRAINER_MAURA] = - { -#line 4249 - .trainerName = _("MAURA"), + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, #line 4250 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4251 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 4249 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 4252 -F_TRAINER_FEMALE | -#line 4253 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + .species = SPECIES_SOLROCK, + .gender = TRAINER_MON_RANDOM_GENDER, #line 4254 - .doubleBattle = FALSE, -#line 4255 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 4253 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4256 + [TRAINER_CAMERON_5] = + { #line 4257 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4259 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), + .trainerName = _("CAMERON"), #line 4258 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4259 + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .encounterMusic_gender = #line 4261 - [TRAINER_KAYLA] = - { + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4262 - .trainerName = _("KAYLA"), + .doubleBattle = FALSE, #line 4263 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4264 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { #line 4265 -F_TRAINER_FEMALE | -#line 4266 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + .species = SPECIES_SOLROCK, + .gender = TRAINER_MON_RANDOM_GENDER, #line 4267 - .doubleBattle = FALSE, -#line 4268 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4270 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4272 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4271 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4274 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4276 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4275 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4278 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4280 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4279 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4282 - [TRAINER_ALEXIS] = - { -#line 4283 - .trainerName = _("ALEXIS"), -#line 4284 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4285 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4286 -F_TRAINER_FEMALE | -#line 4287 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4288 - .doubleBattle = FALSE, -#line 4289 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4291 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4293 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4292 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4295 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4297 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4296 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4299 - [TRAINER_JACKI_1] = - { -#line 4300 - .trainerName = _("JACKI"), -#line 4301 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4302 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4303 -F_TRAINER_FEMALE | -#line 4304 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4305 - .doubleBattle = FALSE, -#line 4306 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4308 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4310 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4309 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4312 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4314 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4313 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4316 - [TRAINER_JACKI_2] = - { -#line 4317 - .trainerName = _("JACKI"), -#line 4318 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4319 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4320 -F_TRAINER_FEMALE | -#line 4321 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4322 - .doubleBattle = FALSE, -#line 4323 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4325 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4327 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4326 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4329 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4331 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4330 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4333 - [TRAINER_JACKI_3] = - { -#line 4334 - .trainerName = _("JACKI"), -#line 4335 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4336 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4337 -F_TRAINER_FEMALE | -#line 4338 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4339 - .doubleBattle = FALSE, -#line 4340 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4342 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4344 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4343 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4346 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4348 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4347 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4350 - [TRAINER_JACKI_4] = - { -#line 4351 - .trainerName = _("JACKI"), -#line 4352 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4353 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4354 -F_TRAINER_FEMALE | -#line 4355 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4356 - .doubleBattle = FALSE, -#line 4357 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4359 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4361 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4360 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4363 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4365 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4364 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4367 - [TRAINER_JACKI_5] = - { -#line 4368 - .trainerName = _("JACKI"), -#line 4369 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4370 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4371 -F_TRAINER_FEMALE | -#line 4372 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4373 - .doubleBattle = FALSE, -#line 4374 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4376 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4378 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4377 - .lvl = 43, +#line 4266 + .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 4380 +#line 4269 .species = SPECIES_ALAKAZAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4382 +#line 4271 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4381 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4384 - [TRAINER_WALTER_1] = - { -#line 4385 - .trainerName = _("WALTER"), -#line 4386 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4387 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4389 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4390 - .doubleBattle = FALSE, -#line 4391 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4393 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4395 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4394 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4397 - [TRAINER_MICAH] = - { -#line 4398 - .trainerName = _("MICAH"), -#line 4399 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4400 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4402 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4403 - .doubleBattle = FALSE, -#line 4404 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4406 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4408 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4407 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4410 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4412 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4411 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4414 - [TRAINER_THOMAS] = - { -#line 4415 - .trainerName = _("THOMAS"), -#line 4416 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4417 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4419 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4420 - .doubleBattle = FALSE, -#line 4421 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4423 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4425 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4424 +#line 4270 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4427 - [TRAINER_WALTER_2] = +#line 4273 + [TRAINER_JACLYN] = { -#line 4428 - .trainerName = _("WALTER"), -#line 4429 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4430 - .trainerPic = TRAINER_PIC_GENTLEMAN, +#line 4274 + .trainerName = _("JACLYN"), +#line 4275 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4276 + .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 4432 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4433 +#line 4277 +F_TRAINER_FEMALE | +#line 4278 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4279 .doubleBattle = FALSE, -#line 4434 +#line 4280 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 4436 - .species = SPECIES_MANECTRIC, +#line 4282 + .species = SPECIES_ABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4438 +#line 4284 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4283 + .lvl = 16, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 4285 + MOVE_HIDDEN_POWER, + }, + }, + }, + }, +#line 4287 + [TRAINER_HANNAH] = + { +#line 4288 + .trainerName = _("HANNAH"), +#line 4289 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4290 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4291 +F_TRAINER_FEMALE | +#line 4292 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4293 + .doubleBattle = FALSE, +#line 4294 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4296 + .species = SPECIES_KIRLIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4298 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 4297 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4300 + [TRAINER_SAMANTHA] = + { +#line 4301 + .trainerName = _("SAMANTHA"), +#line 4302 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4303 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4304 +F_TRAINER_FEMALE | +#line 4305 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4306 + .doubleBattle = FALSE, +#line 4307 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4309 + .species = SPECIES_XATU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4311 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 4310 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4313 + [TRAINER_MAURA] = + { +#line 4314 + .trainerName = _("MAURA"), +#line 4315 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4316 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4317 +F_TRAINER_FEMALE | +#line 4318 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4319 + .doubleBattle = FALSE, +#line 4320 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4322 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4324 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 4323 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4326 + [TRAINER_KAYLA] = + { +#line 4327 + .trainerName = _("KAYLA"), +#line 4328 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4329 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4330 +F_TRAINER_FEMALE | +#line 4331 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4332 + .doubleBattle = FALSE, +#line 4333 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 4335 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4337 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4336 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4339 + .species = SPECIES_NATU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4341 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4340 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4343 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4345 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4344 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4347 + [TRAINER_ALEXIS] = + { +#line 4348 + .trainerName = _("ALEXIS"), +#line 4349 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4350 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4351 +F_TRAINER_FEMALE | +#line 4352 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4353 + .doubleBattle = FALSE, +#line 4354 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4356 + .species = SPECIES_KIRLIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4358 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4357 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4360 + .species = SPECIES_XATU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4362 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4361 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4364 + [TRAINER_JACKI_1] = + { +#line 4365 + .trainerName = _("JACKI"), +#line 4366 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4367 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4368 +F_TRAINER_FEMALE | +#line 4369 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4370 + .doubleBattle = FALSE, +#line 4371 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4373 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4375 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4374 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4377 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4379 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4378 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4381 + [TRAINER_JACKI_2] = + { +#line 4382 + .trainerName = _("JACKI"), +#line 4383 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4384 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4385 +F_TRAINER_FEMALE | +#line 4386 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4387 + .doubleBattle = FALSE, +#line 4388 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4390 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4392 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4437 +#line 4391 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4394 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4396 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 4395 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 4440 - [TRAINER_WALTER_3] = +#line 4398 + [TRAINER_JACKI_3] = { -#line 4441 - .trainerName = _("WALTER"), -#line 4442 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4443 - .trainerPic = TRAINER_PIC_GENTLEMAN, +#line 4399 + .trainerName = _("JACKI"), +#line 4400 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4401 + .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 4445 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4446 +#line 4402 +F_TRAINER_FEMALE | +#line 4403 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4404 .doubleBattle = FALSE, -#line 4447 +#line 4405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { +#line 4407 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4409 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 4408 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4411 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4413 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 4412 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4415 + [TRAINER_JACKI_4] = + { +#line 4416 + .trainerName = _("JACKI"), +#line 4417 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4418 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4419 +F_TRAINER_FEMALE | +#line 4420 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4421 + .doubleBattle = FALSE, +#line 4422 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4424 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4426 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 4425 + .lvl = 40, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4428 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4430 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 4429 + .lvl = 40, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4432 + [TRAINER_JACKI_5] = + { +#line 4433 + .trainerName = _("JACKI"), +#line 4434 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 4435 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 4436 +F_TRAINER_FEMALE | +#line 4437 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 4438 + .doubleBattle = FALSE, +#line 4439 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4441 + .species = SPECIES_LUNATONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4443 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 4442 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4445 + .species = SPECIES_ALAKAZAM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4447 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 4446 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 4449 + [TRAINER_WALTER_1] = + { +#line 4450 + .trainerName = _("WALTER"), +#line 4451 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 4452 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 4454 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 4455 + .doubleBattle = FALSE, +#line 4456 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4458 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4460 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4459 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4462 + [TRAINER_MICAH] = + { +#line 4463 + .trainerName = _("MICAH"), +#line 4464 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 4465 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 4467 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 4468 + .doubleBattle = FALSE, +#line 4469 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4471 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4473 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4472 + .lvl = 44, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 4475 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4477 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4476 + .lvl = 44, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4479 + [TRAINER_THOMAS] = + { +#line 4480 + .trainerName = _("THOMAS"), +#line 4481 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 4482 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 4484 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 4485 + .doubleBattle = FALSE, +#line 4486 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4488 + .species = SPECIES_ZANGOOSE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4490 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 4489 + .lvl = 45, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4492 + [TRAINER_WALTER_2] = + { +#line 4493 + .trainerName = _("WALTER"), +#line 4494 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 4495 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 4497 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 4498 + .doubleBattle = FALSE, +#line 4499 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 4501 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 4503 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 4502 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 4505 + [TRAINER_WALTER_3] = + { +#line 4506 + .trainerName = _("WALTER"), +#line 4507 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 4508 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 4510 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 4511 + .doubleBattle = FALSE, +#line 4512 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 4514 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4451 +#line 4516 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4450 +#line 4515 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4452 +#line 4517 MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, @@ -11227,17 +11227,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4457 +#line 4522 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4459 +#line 4524 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4458 +#line 4523 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4460 +#line 4525 MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, @@ -11246,37 +11246,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 4465 +#line 4530 [TRAINER_WALTER_4] = { -#line 4466 +#line 4531 .trainerName = _("WALTER"), -#line 4467 +#line 4532 .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4468 +#line 4533 .trainerPic = TRAINER_PIC_GENTLEMAN, .encounterMusic_gender = -#line 4470 +#line 4535 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4471 +#line 4536 .doubleBattle = FALSE, -#line 4472 +#line 4537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 4474 +#line 4539 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4476 +#line 4541 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4475 +#line 4540 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4477 +#line 4542 MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, @@ -11284,17 +11284,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4482 +#line 4547 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4484 +#line 4549 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4483 +#line 4548 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4485 +#line 4550 MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, @@ -11302,37 +11302,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 4489 +#line 4554 [TRAINER_WALTER_5] = { -#line 4490 +#line 4555 .trainerName = _("WALTER"), -#line 4491 +#line 4556 .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4492 +#line 4557 .trainerPic = TRAINER_PIC_GENTLEMAN, .encounterMusic_gender = -#line 4494 +#line 4559 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4495 +#line 4560 .doubleBattle = FALSE, -#line 4496 +#line 4561 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 4498 +#line 4563 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4500 +#line 4565 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4499 +#line 4564 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4501 +#line 4566 MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, @@ -11340,17 +11340,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4506 +#line 4571 .species = SPECIES_GOLDUCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4508 +#line 4573 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4507 +#line 4572 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4509 +#line 4574 MOVE_FURY_SWIPES, MOVE_DISABLE, MOVE_CONFUSION, @@ -11358,17 +11358,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4514 +#line 4579 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4516 +#line 4581 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4515 +#line 4580 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4517 +#line 4582 MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, @@ -11377,42 +11377,42 @@ F_TRAINER_FEMALE | }, }, }, -#line 4522 +#line 4587 [TRAINER_SIDNEY] = { -#line 4523 +#line 4588 .trainerName = _("SIDNEY"), -#line 4524 +#line 4589 .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4525 +#line 4590 .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, .encounterMusic_gender = -#line 4527 +#line 4592 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4528 +#line 4593 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4529 +#line 4594 .doubleBattle = FALSE, -#line 4530 +#line 4595 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SETUP_FIRST_TURN, -#line 4531 +#line 4596 .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_PURPLE, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4533 +#line 4598 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4535 +#line 4600 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4534 +#line 4599 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4536 +#line 4601 MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, @@ -11420,17 +11420,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4541 +#line 4606 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4543 +#line 4608 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4542 +#line 4607 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4544 +#line 4609 MOVE_TORMENT, MOVE_DOUBLE_TEAM, MOVE_SWAGGER, @@ -11438,17 +11438,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4549 +#line 4614 .species = SPECIES_CACTURNE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4551 +#line 4616 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4550 +#line 4615 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4552 +#line 4617 MOVE_LEECH_SEED, MOVE_FEINT_ATTACK, MOVE_NEEDLE_ARM, @@ -11456,17 +11456,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4557 +#line 4622 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4559 +#line 4624 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4558 +#line 4623 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4560 +#line 4625 MOVE_SURF, MOVE_SWORDS_DANCE, MOVE_STRENGTH, @@ -11474,19 +11474,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4565 +#line 4630 .species = SPECIES_ABSOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4565 +#line 4630 .heldItem = ITEM_SITRUS_BERRY, -#line 4567 +#line 4632 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4566 +#line 4631 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4568 +#line 4633 MOVE_AERIAL_ACE, MOVE_ROCK_SLIDE, MOVE_SWORDS_DANCE, @@ -11495,44 +11495,44 @@ F_TRAINER_FEMALE | }, }, }, -#line 4573 +#line 4638 [TRAINER_PHOEBE] = { -#line 4574 +#line 4639 .trainerName = _("PHOEBE"), -#line 4575 +#line 4640 .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4576 +#line 4641 .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, .encounterMusic_gender = -#line 4577 +#line 4642 F_TRAINER_FEMALE | -#line 4578 +#line 4643 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4579 +#line 4644 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4580 +#line 4645 .doubleBattle = FALSE, -#line 4581 +#line 4646 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, -#line 4582 +#line 4647 .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_GREEN, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4584 +#line 4649 .species = SPECIES_DUSCLOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4586 +#line 4651 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4585 +#line 4650 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4587 +#line 4652 MOVE_SHADOW_PUNCH, MOVE_CONFUSE_RAY, MOVE_CURSE, @@ -11540,17 +11540,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4592 +#line 4657 .species = SPECIES_BANETTE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4594 +#line 4659 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4593 +#line 4658 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4595 +#line 4660 MOVE_SHADOW_BALL, MOVE_GRUDGE, MOVE_WILL_O_WISP, @@ -11558,17 +11558,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4600 +#line 4665 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4602 +#line 4667 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4601 +#line 4666 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4603 +#line 4668 MOVE_SHADOW_BALL, MOVE_DOUBLE_TEAM, MOVE_NIGHT_SHADE, @@ -11576,17 +11576,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4608 +#line 4673 .species = SPECIES_BANETTE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4610 +#line 4675 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4609 +#line 4674 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4611 +#line 4676 MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, @@ -11594,19 +11594,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4616 +#line 4681 .species = SPECIES_DUSCLOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4616 +#line 4681 .heldItem = ITEM_SITRUS_BERRY, -#line 4618 +#line 4683 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4617 +#line 4682 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4619 +#line 4684 MOVE_SHADOW_BALL, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, @@ -11615,44 +11615,44 @@ F_TRAINER_FEMALE | }, }, }, -#line 4624 +#line 4689 [TRAINER_GLACIA] = { -#line 4625 +#line 4690 .trainerName = _("GLACIA"), -#line 4626 +#line 4691 .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4627 +#line 4692 .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, .encounterMusic_gender = -#line 4628 +#line 4693 F_TRAINER_FEMALE | -#line 4629 +#line 4694 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4630 +#line 4695 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4631 +#line 4696 .doubleBattle = FALSE, -#line 4632 +#line 4697 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, -#line 4633 +#line 4698 .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_PINK, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4635 +#line 4700 .species = SPECIES_SEALEO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4637 +#line 4702 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4636 +#line 4701 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4638 +#line 4703 MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_HAIL, @@ -11660,17 +11660,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4643 +#line 4708 .species = SPECIES_GLALIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4645 +#line 4710 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4644 +#line 4709 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4646 +#line 4711 MOVE_LIGHT_SCREEN, MOVE_CRUNCH, MOVE_ICY_WIND, @@ -11678,17 +11678,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4651 +#line 4716 .species = SPECIES_SEALEO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4653 +#line 4718 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4652 +#line 4717 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4654 +#line 4719 MOVE_ATTRACT, MOVE_DOUBLE_EDGE, MOVE_HAIL, @@ -11696,17 +11696,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4659 +#line 4724 .species = SPECIES_GLALIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4661 +#line 4726 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4660 +#line 4725 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4662 +#line 4727 MOVE_SHADOW_BALL, MOVE_EXPLOSION, MOVE_HAIL, @@ -11714,19 +11714,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4667 +#line 4732 .species = SPECIES_WALREIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4667 +#line 4732 .heldItem = ITEM_SITRUS_BERRY, -#line 4669 +#line 4734 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4668 +#line 4733 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4670 +#line 4735 MOVE_SURF, MOVE_BODY_SLAM, MOVE_ICE_BEAM, @@ -11735,42 +11735,42 @@ F_TRAINER_FEMALE | }, }, }, -#line 4675 +#line 4740 [TRAINER_DRAKE] = { -#line 4676 +#line 4741 .trainerName = _("DRAKE"), -#line 4677 +#line 4742 .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4678 +#line 4743 .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, .encounterMusic_gender = -#line 4680 +#line 4745 TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4681 +#line 4746 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4682 +#line 4747 .doubleBattle = FALSE, -#line 4683 +#line 4748 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, -#line 4684 +#line 4749 .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_BLUE, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4686 +#line 4751 .species = SPECIES_SHELGON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4688 +#line 4753 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4687 +#line 4752 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4689 +#line 4754 MOVE_ROCK_TOMB, MOVE_DRAGON_CLAW, MOVE_PROTECT, @@ -11778,17 +11778,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4694 +#line 4759 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4696 +#line 4761 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4695 +#line 4760 .lvl = 54, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4697 +#line 4762 MOVE_DOUBLE_EDGE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, @@ -11796,17 +11796,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4702 +#line 4767 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4704 +#line 4769 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4703 +#line 4768 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4705 +#line 4770 MOVE_SMOKESCREEN, MOVE_DRAGON_DANCE, MOVE_SURF, @@ -11814,17 +11814,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4710 +#line 4775 .species = SPECIES_FLYGON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4712 +#line 4777 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4711 +#line 4776 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4713 +#line 4778 MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_DRAGON_BREATH, @@ -11832,19 +11832,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4718 +#line 4783 .species = SPECIES_SALAMENCE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4718 +#line 4783 .heldItem = ITEM_SITRUS_BERRY, -#line 4720 +#line 4785 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4719 +#line 4784 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4721 +#line 4786 MOVE_FLAMETHROWER, MOVE_DRAGON_CLAW, MOVE_ROCK_SLIDE, @@ -11853,41 +11853,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 4726 +#line 4791 [TRAINER_ROXANNE_1] = { -#line 4727 +#line 4792 .trainerName = _("ROXANNE"), -#line 4728 +#line 4793 .trainerClass = TRAINER_CLASS_LEADER, -#line 4729 +#line 4794 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = -#line 4730 +#line 4795 F_TRAINER_FEMALE | -#line 4731 +#line 4796 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4732 +#line 4797 .items = { ITEM_POTION, ITEM_POTION }, -#line 4733 +#line 4798 .doubleBattle = FALSE, -#line 4734 +#line 4799 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 4736 +#line 4801 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4738 +#line 4803 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4737 +#line 4802 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4739 +#line 4804 MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, @@ -11895,17 +11895,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4744 +#line 4809 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4746 +#line 4811 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4745 +#line 4810 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4747 +#line 4812 MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, @@ -11913,19 +11913,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4752 +#line 4817 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4752 +#line 4817 .heldItem = ITEM_ORAN_BERRY, -#line 4754 +#line 4819 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4753 +#line 4818 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4755 +#line 4820 MOVE_BLOCK, MOVE_HARDEN, MOVE_TACKLE, @@ -11934,39 +11934,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 4760 +#line 4825 [TRAINER_BRAWLY_1] = { -#line 4761 +#line 4826 .trainerName = _("BRAWLY"), -#line 4762 +#line 4827 .trainerClass = TRAINER_CLASS_LEADER, -#line 4763 +#line 4828 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .encounterMusic_gender = -#line 4765 +#line 4830 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4766 +#line 4831 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4767 +#line 4832 .doubleBattle = FALSE, -#line 4768 +#line 4833 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 4770 +#line 4835 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4772 +#line 4837 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4771 +#line 4836 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4773 +#line 4838 MOVE_KARATE_CHOP, MOVE_LOW_KICK, MOVE_SEISMIC_TOSS, @@ -11974,17 +11974,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4778 +#line 4843 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4780 +#line 4845 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4779 +#line 4844 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4781 +#line 4846 MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, @@ -11992,19 +11992,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4786 +#line 4851 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4786 +#line 4851 .heldItem = ITEM_SITRUS_BERRY, -#line 4788 +#line 4853 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4787 +#line 4852 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4789 +#line 4854 MOVE_ARM_THRUST, MOVE_VITAL_THROW, MOVE_REVERSAL, @@ -12013,39 +12013,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 4794 +#line 4859 [TRAINER_WATTSON_1] = { -#line 4795 +#line 4860 .trainerName = _("WATTSON"), -#line 4796 +#line 4861 .trainerClass = TRAINER_CLASS_LEADER, -#line 4797 +#line 4862 .trainerPic = TRAINER_PIC_LEADER_WATTSON, .encounterMusic_gender = -#line 4799 +#line 4864 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4800 +#line 4865 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4801 +#line 4866 .doubleBattle = FALSE, -#line 4802 +#line 4867 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 4804 +#line 4869 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4806 +#line 4871 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4805 +#line 4870 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4807 +#line 4872 MOVE_ROLLOUT, MOVE_SPARK, MOVE_SELF_DESTRUCT, @@ -12053,17 +12053,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4812 +#line 4877 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4814 +#line 4879 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4813 +#line 4878 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4815 +#line 4880 MOVE_SHOCK_WAVE, MOVE_LEER, MOVE_QUICK_ATTACK, @@ -12071,17 +12071,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4820 +#line 4885 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4822 +#line 4887 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 4821 +#line 4886 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4823 +#line 4888 MOVE_SUPERSONIC, MOVE_SHOCK_WAVE, MOVE_THUNDER_WAVE, @@ -12089,19 +12089,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4828 +#line 4893 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4828 +#line 4893 .heldItem = ITEM_SITRUS_BERRY, -#line 4830 +#line 4895 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4829 +#line 4894 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4831 +#line 4896 MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SHOCK_WAVE, @@ -12110,41 +12110,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 4836 +#line 4901 [TRAINER_FLANNERY_1] = { -#line 4837 +#line 4902 .trainerName = _("FLANNERY"), -#line 4838 +#line 4903 .trainerClass = TRAINER_CLASS_LEADER, -#line 4839 +#line 4904 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = -#line 4840 +#line 4905 F_TRAINER_FEMALE | -#line 4841 +#line 4906 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4842 +#line 4907 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4843 +#line 4908 .doubleBattle = FALSE, -#line 4844 +#line 4909 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 4846 +#line 4911 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4848 +#line 4913 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4847 +#line 4912 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4849 +#line 4914 MOVE_OVERHEAT, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, @@ -12152,17 +12152,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4854 +#line 4919 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4856 +#line 4921 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4855 +#line 4920 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4857 +#line 4922 MOVE_OVERHEAT, MOVE_SMOG, MOVE_LIGHT_SCREEN, @@ -12170,17 +12170,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4862 +#line 4927 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4864 +#line 4929 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4863 +#line 4928 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4865 +#line 4930 MOVE_OVERHEAT, MOVE_TACKLE, MOVE_SUNNY_DAY, @@ -12188,19 +12188,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4870 +#line 4935 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4870 +#line 4935 .heldItem = ITEM_WHITE_HERB, -#line 4872 +#line 4937 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4871 +#line 4936 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4873 +#line 4938 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_BODY_SLAM, @@ -12209,39 +12209,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 4878 +#line 4943 [TRAINER_NORMAN_1] = { -#line 4879 +#line 4944 .trainerName = _("NORMAN"), -#line 4880 +#line 4945 .trainerClass = TRAINER_CLASS_LEADER, -#line 4881 +#line 4946 .trainerPic = TRAINER_PIC_LEADER_NORMAN, .encounterMusic_gender = -#line 4883 +#line 4948 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4884 +#line 4949 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4885 +#line 4950 .doubleBattle = FALSE, -#line 4886 +#line 4951 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 4888 +#line 4953 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4890 +#line 4955 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4889 +#line 4954 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4891 +#line 4956 MOVE_TEETER_DANCE, MOVE_PSYBEAM, MOVE_FACADE, @@ -12249,17 +12249,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4896 +#line 4961 .species = SPECIES_VIGOROTH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4898 +#line 4963 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4897 +#line 4962 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4899 +#line 4964 MOVE_SLASH, MOVE_FACADE, MOVE_ENCORE, @@ -12267,17 +12267,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4904 +#line 4969 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4906 +#line 4971 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4905 +#line 4970 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4907 +#line 4972 MOVE_SLASH, MOVE_BELLY_DRUM, MOVE_FACADE, @@ -12285,19 +12285,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4912 +#line 4977 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4912 +#line 4977 .heldItem = ITEM_SITRUS_BERRY, -#line 4914 +#line 4979 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4913 +#line 4978 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4915 +#line 4980 MOVE_COUNTER, MOVE_YAWN, MOVE_FACADE, @@ -12306,41 +12306,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 4920 +#line 4985 [TRAINER_WINONA_1] = { -#line 4921 +#line 4986 .trainerName = _("WINONA"), -#line 4922 +#line 4987 .trainerClass = TRAINER_CLASS_LEADER, -#line 4923 +#line 4988 .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = -#line 4924 +#line 4989 F_TRAINER_FEMALE | -#line 4925 +#line 4990 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4926 +#line 4991 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4927 +#line 4992 .doubleBattle = FALSE, -#line 4928 +#line 4993 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 4930 +#line 4995 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4932 +#line 4997 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 4931 +#line 4996 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4933 +#line 4998 MOVE_PERISH_SONG, MOVE_MIRROR_MOVE, MOVE_SAFEGUARD, @@ -12348,17 +12348,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4938 +#line 5003 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4940 +#line 5005 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 4939 +#line 5004 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4941 +#line 5006 MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, @@ -12366,17 +12366,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4946 +#line 5011 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4948 +#line 5013 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 4947 +#line 5012 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4949 +#line 5014 MOVE_WATER_GUN, MOVE_SUPERSONIC, MOVE_PROTECT, @@ -12384,17 +12384,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4954 +#line 5019 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4956 +#line 5021 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 4955 +#line 5020 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4957 +#line 5022 MOVE_SAND_ATTACK, MOVE_FURY_ATTACK, MOVE_STEEL_WING, @@ -12402,19 +12402,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4962 +#line 5027 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4962 +#line 5027 .heldItem = ITEM_ORAN_BERRY, -#line 4964 +#line 5029 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4963 +#line 5028 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4965 +#line 5030 MOVE_EARTHQUAKE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, @@ -12423,39 +12423,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 4970 +#line 5035 [TRAINER_TATE_AND_LIZA_1] = { -#line 4971 +#line 5036 .trainerName = _("TATE&LIZA"), -#line 4972 +#line 5037 .trainerClass = TRAINER_CLASS_LEADER, -#line 4973 +#line 5038 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .encounterMusic_gender = -#line 4975 +#line 5040 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4976 +#line 5041 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4977 +#line 5042 .doubleBattle = TRUE, -#line 4978 +#line 5043 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 4980 +#line 5045 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4982 +#line 5047 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4981 +#line 5046 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4983 +#line 5048 MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, @@ -12463,17 +12463,17 @@ F_TRAINER_FEMALE | }, }, { -#line 4988 +#line 5053 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4990 +#line 5055 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4989 +#line 5054 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4991 +#line 5056 MOVE_PSYCHIC, MOVE_SUNNY_DAY, MOVE_CONFUSE_RAY, @@ -12481,19 +12481,19 @@ F_TRAINER_FEMALE | }, }, { -#line 4996 +#line 5061 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 4996 +#line 5061 .heldItem = ITEM_SITRUS_BERRY, -#line 4998 +#line 5063 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4997 +#line 5062 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 4999 +#line 5064 MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_HYPNOSIS, @@ -12501,19 +12501,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5004 +#line 5069 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5004 +#line 5069 .heldItem = ITEM_SITRUS_BERRY, -#line 5006 +#line 5071 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5005 +#line 5070 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5007 +#line 5072 MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, @@ -12522,39 +12522,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 5012 +#line 5077 [TRAINER_JUAN_1] = { -#line 5013 +#line 5078 .trainerName = _("JUAN"), -#line 5014 +#line 5079 .trainerClass = TRAINER_CLASS_LEADER, -#line 5015 +#line 5080 .trainerPic = TRAINER_PIC_LEADER_JUAN, .encounterMusic_gender = -#line 5017 +#line 5082 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5018 +#line 5083 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 5019 +#line 5084 .doubleBattle = FALSE, -#line 5020 +#line 5085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 5022 +#line 5087 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5024 +#line 5089 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5023 +#line 5088 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5025 +#line 5090 MOVE_WATER_PULSE, MOVE_ATTRACT, MOVE_SWEET_KISS, @@ -12562,17 +12562,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5030 +#line 5095 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5032 +#line 5097 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5031 +#line 5096 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5033 +#line 5098 MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_AMNESIA, @@ -12580,17 +12580,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5038 +#line 5103 .species = SPECIES_SEALEO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5040 +#line 5105 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5039 +#line 5104 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5041 +#line 5106 MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_AURORA_BEAM, @@ -12598,17 +12598,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5046 +#line 5111 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5048 +#line 5113 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5047 +#line 5112 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5049 +#line 5114 MOVE_WATER_PULSE, MOVE_CRABHAMMER, MOVE_TAUNT, @@ -12616,19 +12616,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5054 +#line 5119 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5054 +#line 5119 .heldItem = ITEM_CHESTO_BERRY, -#line 5056 +#line 5121 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5055 +#line 5120 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5057 +#line 5122 MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, @@ -12637,597 +12637,597 @@ F_TRAINER_FEMALE | }, }, }, -#line 5062 +#line 5127 [TRAINER_JERRY_1] = { -#line 5063 +#line 5128 .trainerName = _("JERRY"), -#line 5064 +#line 5129 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5065 +#line 5130 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5067 +#line 5132 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5068 +#line 5133 .doubleBattle = FALSE, -#line 5069 +#line 5134 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5071 +#line 5136 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5073 +#line 5138 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5072 +#line 5137 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5075 +#line 5140 [TRAINER_TED] = { -#line 5076 +#line 5141 .trainerName = _("TED"), -#line 5077 +#line 5142 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5078 +#line 5143 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5080 +#line 5145 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5081 +#line 5146 .doubleBattle = FALSE, -#line 5082 +#line 5147 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5084 +#line 5149 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5086 +#line 5151 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5085 +#line 5150 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5088 +#line 5153 [TRAINER_PAUL] = { -#line 5089 +#line 5154 .trainerName = _("PAUL"), -#line 5090 +#line 5155 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5091 +#line 5156 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5093 +#line 5158 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5094 +#line 5159 .doubleBattle = FALSE, -#line 5095 +#line 5160 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 5097 +#line 5162 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5099 +#line 5164 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5098 +#line 5163 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5101 +#line 5166 .species = SPECIES_ODDISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5103 +#line 5168 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5102 +#line 5167 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5105 +#line 5170 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5107 +#line 5172 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5106 +#line 5171 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5109 +#line 5174 [TRAINER_JERRY_2] = { -#line 5110 +#line 5175 .trainerName = _("JERRY"), -#line 5111 +#line 5176 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5112 +#line 5177 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5114 +#line 5179 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5115 +#line 5180 .doubleBattle = FALSE, -#line 5116 +#line 5181 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5118 +#line 5183 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5120 +#line 5185 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5119 +#line 5184 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5122 +#line 5187 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5124 +#line 5189 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5123 +#line 5188 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5126 +#line 5191 [TRAINER_JERRY_3] = { -#line 5127 +#line 5192 .trainerName = _("JERRY"), -#line 5128 +#line 5193 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5129 +#line 5194 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5131 +#line 5196 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5132 +#line 5197 .doubleBattle = FALSE, -#line 5133 +#line 5198 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5135 +#line 5200 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5137 +#line 5202 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5136 +#line 5201 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5139 +#line 5204 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5141 +#line 5206 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5140 +#line 5205 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5143 +#line 5208 [TRAINER_JERRY_4] = { -#line 5144 +#line 5209 .trainerName = _("JERRY"), -#line 5145 +#line 5210 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5146 +#line 5211 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5148 +#line 5213 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5149 +#line 5214 .doubleBattle = FALSE, -#line 5150 +#line 5215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5152 +#line 5217 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5154 +#line 5219 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5153 +#line 5218 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5156 +#line 5221 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5158 +#line 5223 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5157 +#line 5222 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5160 +#line 5225 [TRAINER_JERRY_5] = { -#line 5161 +#line 5226 .trainerName = _("JERRY"), -#line 5162 +#line 5227 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5163 +#line 5228 .trainerPic = TRAINER_PIC_SCHOOL_KID_M, .encounterMusic_gender = -#line 5165 +#line 5230 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5166 +#line 5231 .doubleBattle = FALSE, -#line 5167 +#line 5232 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 5169 +#line 5234 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5171 +#line 5236 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5170 +#line 5235 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5173 +#line 5238 .species = SPECIES_BANETTE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5175 +#line 5240 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5174 +#line 5239 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5177 +#line 5242 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5179 +#line 5244 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5178 +#line 5243 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5181 +#line 5246 [TRAINER_KAREN_1] = { -#line 5182 +#line 5247 .trainerName = _("KAREN"), -#line 5183 +#line 5248 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5184 +#line 5249 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5185 +#line 5250 F_TRAINER_FEMALE | -#line 5186 +#line 5251 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5187 +#line 5252 .doubleBattle = FALSE, -#line 5188 +#line 5253 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5190 +#line 5255 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5192 +#line 5257 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5191 +#line 5256 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5194 +#line 5259 [TRAINER_GEORGIA] = { -#line 5195 +#line 5260 .trainerName = _("GEORGIA"), -#line 5196 +#line 5261 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5197 +#line 5262 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5198 +#line 5263 F_TRAINER_FEMALE | -#line 5199 +#line 5264 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5200 +#line 5265 .doubleBattle = FALSE, -#line 5201 +#line 5266 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5203 +#line 5268 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5205 +#line 5270 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5204 +#line 5269 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5207 +#line 5272 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5209 +#line 5274 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5208 +#line 5273 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5211 +#line 5276 [TRAINER_KAREN_2] = { -#line 5212 +#line 5277 .trainerName = _("KAREN"), -#line 5213 +#line 5278 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5214 +#line 5279 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5215 +#line 5280 F_TRAINER_FEMALE | -#line 5216 +#line 5281 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5217 +#line 5282 .doubleBattle = FALSE, -#line 5218 +#line 5283 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5220 +#line 5285 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5222 +#line 5287 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5221 +#line 5286 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5224 +#line 5289 .species = SPECIES_WHISMUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5226 +#line 5291 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5225 +#line 5290 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5228 +#line 5293 [TRAINER_KAREN_3] = { -#line 5229 +#line 5294 .trainerName = _("KAREN"), -#line 5230 +#line 5295 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5231 +#line 5296 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5232 +#line 5297 F_TRAINER_FEMALE | -#line 5233 +#line 5298 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5234 +#line 5299 .doubleBattle = FALSE, -#line 5235 +#line 5300 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5237 +#line 5302 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5239 +#line 5304 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5238 +#line 5303 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5241 +#line 5306 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5243 +#line 5308 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5242 +#line 5307 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5245 +#line 5310 [TRAINER_KAREN_4] = { -#line 5246 +#line 5311 .trainerName = _("KAREN"), -#line 5247 +#line 5312 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5248 +#line 5313 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5249 +#line 5314 F_TRAINER_FEMALE | -#line 5250 +#line 5315 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5251 +#line 5316 .doubleBattle = FALSE, -#line 5252 +#line 5317 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5254 +#line 5319 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5256 +#line 5321 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5255 +#line 5320 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5258 +#line 5323 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5260 +#line 5325 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5259 +#line 5324 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5262 +#line 5327 [TRAINER_KAREN_5] = { -#line 5263 +#line 5328 .trainerName = _("KAREN"), -#line 5264 +#line 5329 .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5265 +#line 5330 .trainerPic = TRAINER_PIC_SCHOOL_KID_F, .encounterMusic_gender = -#line 5266 +#line 5331 F_TRAINER_FEMALE | -#line 5267 +#line 5332 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5268 +#line 5333 .doubleBattle = FALSE, -#line 5269 +#line 5334 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5271 +#line 5336 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5273 +#line 5338 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5272 +#line 5337 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5275 +#line 5340 .species = SPECIES_EXPLOUD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5277 +#line 5342 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5276 +#line 5341 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5279 +#line 5344 [TRAINER_KATE_AND_JOY] = { -#line 5280 +#line 5345 .trainerName = _("KATE & JOY"), -#line 5281 +#line 5346 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5282 +#line 5347 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 5284 +#line 5349 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5285 +#line 5350 .doubleBattle = TRUE, -#line 5286 +#line 5351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5288 +#line 5353 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5290 +#line 5355 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5289 +#line 5354 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5291 +#line 5356 MOVE_HYPNOSIS, MOVE_PSYBEAM, MOVE_DIZZY_PUNCH, @@ -13235,17 +13235,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5296 +#line 5361 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5298 +#line 5363 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5297 +#line 5362 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5299 +#line 5364 MOVE_FOCUS_PUNCH, MOVE_YAWN, MOVE_SLACK_OFF, @@ -13254,37 +13254,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5304 +#line 5369 [TRAINER_ANNA_AND_MEG_1] = { -#line 5305 +#line 5370 .trainerName = _("ANNA & MEG"), -#line 5306 +#line 5371 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5307 +#line 5372 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 5309 +#line 5374 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5310 +#line 5375 .doubleBattle = TRUE, -#line 5311 +#line 5376 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5313 +#line 5378 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5315 +#line 5380 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5314 +#line 5379 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5316 +#line 5381 MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, @@ -13292,17 +13292,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5321 +#line 5386 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5323 +#line 5388 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5322 +#line 5387 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5324 +#line 5389 MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, @@ -13310,37 +13310,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5328 +#line 5393 [TRAINER_ANNA_AND_MEG_2] = { -#line 5329 +#line 5394 .trainerName = _("ANNA & MEG"), -#line 5330 +#line 5395 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5331 +#line 5396 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 5333 +#line 5398 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5334 +#line 5399 .doubleBattle = TRUE, -#line 5335 +#line 5400 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5337 +#line 5402 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5339 +#line 5404 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5338 +#line 5403 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5340 +#line 5405 MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, @@ -13348,17 +13348,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5345 +#line 5410 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5347 +#line 5412 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5346 +#line 5411 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5348 +#line 5413 MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, @@ -13366,37 +13366,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5352 +#line 5417 [TRAINER_ANNA_AND_MEG_3] = { -#line 5353 +#line 5418 .trainerName = _("ANNA & MEG"), -#line 5354 +#line 5419 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5355 +#line 5420 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 5357 +#line 5422 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5358 +#line 5423 .doubleBattle = TRUE, -#line 5359 +#line 5424 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5361 +#line 5426 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5363 +#line 5428 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5362 +#line 5427 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5364 +#line 5429 MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, @@ -13404,250 +13404,250 @@ F_TRAINER_FEMALE | }, }, { -#line 5369 +#line 5434 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5371 +#line 5436 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5370 +#line 5435 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5372 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5376 - [TRAINER_ANNA_AND_MEG_4] = - { -#line 5377 - .trainerName = _("ANNA & MEG"), -#line 5378 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5379 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5381 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5382 - .doubleBattle = TRUE, -#line 5383 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5385 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5387 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5386 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5388 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5393 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5395 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5394 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5396 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5400 - [TRAINER_ANNA_AND_MEG_5] = - { -#line 5401 - .trainerName = _("ANNA & MEG"), -#line 5402 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5403 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5405 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5406 - .doubleBattle = TRUE, -#line 5407 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5409 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5411 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5410 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5412 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5417 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5419 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5418 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5420 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5424 - [TRAINER_VICTOR] = - { -#line 5425 - .trainerName = _("VICTOR"), -#line 5426 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5427 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5429 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5430 - .doubleBattle = FALSE, -#line 5431 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5433 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5433 - .heldItem = ITEM_ORAN_BERRY, -#line 5435 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5434 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { #line 5437 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5437 - .heldItem = ITEM_ORAN_BERRY, -#line 5439 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5438 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, + MOVE_TACKLE, + MOVE_FOCUS_ENERGY, + MOVE_ARM_THRUST, + }, }, }, }, #line 5441 - [TRAINER_MIGUEL_1] = + [TRAINER_ANNA_AND_MEG_4] = { #line 5442 - .trainerName = _("MIGUEL"), + .trainerName = _("ANNA & MEG"), #line 5443 - .trainerClass = TRAINER_CLASS_POKEFAN, + .trainerClass = TRAINER_CLASS_SR_AND_JR, #line 5444 - .trainerPic = TRAINER_PIC_POKEFAN_M, + .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = #line 5446 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5447 - .doubleBattle = FALSE, + .doubleBattle = TRUE, #line 5448 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 5450 + .species = SPECIES_LINOONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5452 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 5451 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 5453 + MOVE_GROWL, + MOVE_TAIL_WHIP, + MOVE_HEADBUTT, + MOVE_ODOR_SLEUTH, + }, + }, + { +#line 5458 + .species = SPECIES_MAKUHITA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5460 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 5459 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 5461 + MOVE_TACKLE, + MOVE_FOCUS_ENERGY, + MOVE_ARM_THRUST, + }, + }, + }, + }, +#line 5465 + [TRAINER_ANNA_AND_MEG_5] = + { +#line 5466 + .trainerName = _("ANNA & MEG"), +#line 5467 + .trainerClass = TRAINER_CLASS_SR_AND_JR, +#line 5468 + .trainerPic = TRAINER_PIC_SR_AND_JR, + .encounterMusic_gender = +#line 5470 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5471 + .doubleBattle = TRUE, +#line 5472 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 5474 + .species = SPECIES_LINOONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5476 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 5475 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 5477 + MOVE_GROWL, + MOVE_TAIL_WHIP, + MOVE_HEADBUTT, + MOVE_ODOR_SLEUTH, + }, + }, + { +#line 5482 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5484 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 5483 + .lvl = 38, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 5485 + MOVE_TACKLE, + MOVE_FOCUS_ENERGY, + MOVE_ARM_THRUST, + }, + }, + }, + }, +#line 5489 + [TRAINER_VICTOR] = + { +#line 5490 + .trainerName = _("VICTOR"), +#line 5491 + .trainerClass = TRAINER_CLASS_WINSTRATE, +#line 5492 + .trainerPic = TRAINER_PIC_POKEFAN_M, + .encounterMusic_gender = +#line 5494 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5495 + .doubleBattle = FALSE, +#line 5496 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 5498 + .species = SPECIES_TAILLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5498 + .heldItem = ITEM_ORAN_BERRY, +#line 5500 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 5499 + .lvl = 16, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 5502 + .species = SPECIES_ZIGZAGOON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5502 + .heldItem = ITEM_ORAN_BERRY, +#line 5504 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 5503 + .lvl = 16, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5506 + [TRAINER_MIGUEL_1] = + { +#line 5507 + .trainerName = _("MIGUEL"), +#line 5508 + .trainerClass = TRAINER_CLASS_POKEFAN, +#line 5509 + .trainerPic = TRAINER_PIC_POKEFAN_M, + .encounterMusic_gender = +#line 5511 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5512 + .doubleBattle = FALSE, +#line 5513 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5450 +#line 5515 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5450 +#line 5515 .heldItem = ITEM_ORAN_BERRY, -#line 5452 +#line 5517 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5451 +#line 5516 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5454 +#line 5519 [TRAINER_COLTON] = { -#line 5455 +#line 5520 .trainerName = _("COLTON"), -#line 5456 +#line 5521 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5457 +#line 5522 .trainerPic = TRAINER_PIC_POKEFAN_M, .encounterMusic_gender = -#line 5459 +#line 5524 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5460 +#line 5525 .doubleBattle = FALSE, -#line 5461 +#line 5526 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 5463 +#line 5528 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5463 +#line 5528 .heldItem = ITEM_ORAN_BERRY, -#line 5465 +#line 5530 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5464 +#line 5529 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5466 +#line 5531 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13655,19 +13655,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5471 +#line 5536 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5471 +#line 5536 .heldItem = ITEM_ORAN_BERRY, -#line 5473 +#line 5538 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5472 +#line 5537 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5474 +#line 5539 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13675,19 +13675,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5479 +#line 5544 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5479 +#line 5544 .heldItem = ITEM_ORAN_BERRY, -#line 5481 +#line 5546 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5480 +#line 5545 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5482 +#line 5547 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13695,19 +13695,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5487 +#line 5552 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5487 +#line 5552 .heldItem = ITEM_ORAN_BERRY, -#line 5489 +#line 5554 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5488 +#line 5553 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5490 +#line 5555 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13715,19 +13715,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5495 +#line 5560 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5495 +#line 5560 .heldItem = ITEM_ORAN_BERRY, -#line 5497 +#line 5562 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5496 +#line 5561 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5498 +#line 5563 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13735,19 +13735,19 @@ F_TRAINER_FEMALE | }, }, { -#line 5503 +#line 5568 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5503 +#line 5568 .heldItem = ITEM_ORAN_BERRY, -#line 5505 +#line 5570 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5504 +#line 5569 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5506 +#line 5571 MOVE_ASSIST, MOVE_CHARM, MOVE_FEINT_ATTACK, @@ -13756,190 +13756,16 @@ F_TRAINER_FEMALE | }, }, }, -#line 5511 +#line 5576 [TRAINER_MIGUEL_2] = { -#line 5512 - .trainerName = _("MIGUEL"), -#line 5513 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5514 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5516 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5517 - .doubleBattle = FALSE, -#line 5518 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5520 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5520 - .heldItem = ITEM_ORAN_BERRY, -#line 5522 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5521 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5524 - [TRAINER_MIGUEL_3] = - { -#line 5525 - .trainerName = _("MIGUEL"), -#line 5526 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5527 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5529 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5530 - .doubleBattle = FALSE, -#line 5531 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5533 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5533 - .heldItem = ITEM_ORAN_BERRY, -#line 5535 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5534 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5537 - [TRAINER_MIGUEL_4] = - { -#line 5538 - .trainerName = _("MIGUEL"), -#line 5539 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5540 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5542 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5543 - .doubleBattle = FALSE, -#line 5544 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5546 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5546 - .heldItem = ITEM_ORAN_BERRY, -#line 5548 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5547 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5550 - [TRAINER_MIGUEL_5] = - { -#line 5551 - .trainerName = _("MIGUEL"), -#line 5552 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5553 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5555 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5556 - .doubleBattle = FALSE, -#line 5557 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5559 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5559 - .heldItem = ITEM_SITRUS_BERRY, -#line 5561 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5560 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5563 - [TRAINER_VICTORIA] = - { -#line 5564 - .trainerName = _("VICTORIA"), -#line 5565 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5566 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5567 -F_TRAINER_FEMALE | -#line 5568 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5569 - .doubleBattle = FALSE, -#line 5570 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5572 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5572 - .heldItem = ITEM_ORAN_BERRY, -#line 5574 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5573 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5576 - [TRAINER_VANESSA] = - { #line 5577 - .trainerName = _("VANESSA"), + .trainerName = _("MIGUEL"), #line 5578 .trainerClass = TRAINER_CLASS_POKEFAN, #line 5579 - .trainerPic = TRAINER_PIC_POKEFAN_F, + .trainerPic = TRAINER_PIC_POKEFAN_M, .encounterMusic_gender = -#line 5580 -F_TRAINER_FEMALE | #line 5581 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5582 @@ -13951,389 +13777,563 @@ F_TRAINER_FEMALE | { { #line 5585 - .species = SPECIES_PIKACHU, + .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, #line 5585 .heldItem = ITEM_ORAN_BERRY, #line 5587 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 5586 - .lvl = 30, + .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 5589 - [TRAINER_BETHANY] = + [TRAINER_MIGUEL_3] = { #line 5590 - .trainerName = _("BETHANY"), + .trainerName = _("MIGUEL"), #line 5591 .trainerClass = TRAINER_CLASS_POKEFAN, #line 5592 - .trainerPic = TRAINER_PIC_POKEFAN_F, + .trainerPic = TRAINER_PIC_POKEFAN_M, .encounterMusic_gender = -#line 5593 -F_TRAINER_FEMALE | #line 5594 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5595 .doubleBattle = FALSE, #line 5596 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, + .partySize = 1, .party = (const struct TrainerMon[]) { { #line 5598 - .species = SPECIES_AZURILL, + .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, #line 5598 .heldItem = ITEM_ORAN_BERRY, #line 5600 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 5599 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5602 + [TRAINER_MIGUEL_4] = + { +#line 5603 + .trainerName = _("MIGUEL"), +#line 5604 + .trainerClass = TRAINER_CLASS_POKEFAN, +#line 5605 + .trainerPic = TRAINER_PIC_POKEFAN_M, + .encounterMusic_gender = +#line 5607 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5608 + .doubleBattle = FALSE, +#line 5609 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 5611 + .species = SPECIES_DELCATTY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5611 + .heldItem = ITEM_ORAN_BERRY, +#line 5613 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 5612 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5615 + [TRAINER_MIGUEL_5] = + { +#line 5616 + .trainerName = _("MIGUEL"), +#line 5617 + .trainerClass = TRAINER_CLASS_POKEFAN, +#line 5618 + .trainerPic = TRAINER_PIC_POKEFAN_M, + .encounterMusic_gender = +#line 5620 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5621 + .doubleBattle = FALSE, +#line 5622 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 5624 + .species = SPECIES_DELCATTY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5624 + .heldItem = ITEM_SITRUS_BERRY, +#line 5626 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 5625 + .lvl = 38, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5628 + [TRAINER_VICTORIA] = + { +#line 5629 + .trainerName = _("VICTORIA"), +#line 5630 + .trainerClass = TRAINER_CLASS_WINSTRATE, +#line 5631 + .trainerPic = TRAINER_PIC_POKEFAN_F, + .encounterMusic_gender = +#line 5632 +F_TRAINER_FEMALE | +#line 5633 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5634 + .doubleBattle = FALSE, +#line 5635 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 5637 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5637 + .heldItem = ITEM_ORAN_BERRY, +#line 5639 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 5638 + .lvl = 17, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5641 + [TRAINER_VANESSA] = + { +#line 5642 + .trainerName = _("VANESSA"), +#line 5643 + .trainerClass = TRAINER_CLASS_POKEFAN, +#line 5644 + .trainerPic = TRAINER_PIC_POKEFAN_F, + .encounterMusic_gender = +#line 5645 +F_TRAINER_FEMALE | +#line 5646 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5647 + .doubleBattle = FALSE, +#line 5648 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 5650 + .species = SPECIES_PIKACHU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5650 + .heldItem = ITEM_ORAN_BERRY, +#line 5652 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 5651 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 5654 + [TRAINER_BETHANY] = + { +#line 5655 + .trainerName = _("BETHANY"), +#line 5656 + .trainerClass = TRAINER_CLASS_POKEFAN, +#line 5657 + .trainerPic = TRAINER_PIC_POKEFAN_F, + .encounterMusic_gender = +#line 5658 +F_TRAINER_FEMALE | +#line 5659 + TRAINER_ENCOUNTER_MUSIC_TWINS, +#line 5660 + .doubleBattle = FALSE, +#line 5661 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 5663 + .species = SPECIES_AZURILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 5663 + .heldItem = ITEM_ORAN_BERRY, +#line 5665 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 5664 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5602 +#line 5667 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5602 +#line 5667 .heldItem = ITEM_ORAN_BERRY, -#line 5604 +#line 5669 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5603 +#line 5668 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5606 +#line 5671 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5606 +#line 5671 .heldItem = ITEM_ORAN_BERRY, -#line 5608 +#line 5673 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5607 +#line 5672 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5610 +#line 5675 [TRAINER_ISABEL_1] = { -#line 5611 +#line 5676 .trainerName = _("ISABEL"), -#line 5612 +#line 5677 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5613 +#line 5678 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 5614 +#line 5679 F_TRAINER_FEMALE | -#line 5615 +#line 5680 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5616 +#line 5681 .doubleBattle = FALSE, -#line 5617 +#line 5682 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5619 +#line 5684 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5619 +#line 5684 .heldItem = ITEM_ORAN_BERRY, -#line 5621 +#line 5686 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5620 +#line 5685 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5623 +#line 5688 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5623 +#line 5688 .heldItem = ITEM_ORAN_BERRY, -#line 5625 +#line 5690 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5624 +#line 5689 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5627 +#line 5692 [TRAINER_ISABEL_2] = { -#line 5628 +#line 5693 .trainerName = _("ISABEL"), -#line 5629 +#line 5694 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5630 +#line 5695 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 5631 +#line 5696 F_TRAINER_FEMALE | -#line 5632 +#line 5697 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5633 +#line 5698 .doubleBattle = FALSE, -#line 5634 +#line 5699 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5636 +#line 5701 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5636 +#line 5701 .heldItem = ITEM_ORAN_BERRY, -#line 5638 +#line 5703 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5637 +#line 5702 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5640 +#line 5705 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5640 +#line 5705 .heldItem = ITEM_ORAN_BERRY, -#line 5642 +#line 5707 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5641 +#line 5706 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5644 +#line 5709 [TRAINER_ISABEL_3] = { -#line 5645 +#line 5710 .trainerName = _("ISABEL"), -#line 5646 +#line 5711 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5647 +#line 5712 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 5648 +#line 5713 F_TRAINER_FEMALE | -#line 5649 +#line 5714 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5650 +#line 5715 .doubleBattle = FALSE, -#line 5651 +#line 5716 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5653 +#line 5718 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5653 +#line 5718 .heldItem = ITEM_ORAN_BERRY, -#line 5655 +#line 5720 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5654 +#line 5719 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5657 +#line 5722 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5657 +#line 5722 .heldItem = ITEM_ORAN_BERRY, -#line 5659 +#line 5724 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5658 +#line 5723 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5661 +#line 5726 [TRAINER_ISABEL_4] = { -#line 5662 +#line 5727 .trainerName = _("ISABEL"), -#line 5663 +#line 5728 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5664 +#line 5729 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 5665 +#line 5730 F_TRAINER_FEMALE | -#line 5666 +#line 5731 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5667 +#line 5732 .doubleBattle = FALSE, -#line 5668 +#line 5733 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5670 +#line 5735 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5670 +#line 5735 .heldItem = ITEM_ORAN_BERRY, -#line 5672 +#line 5737 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5671 +#line 5736 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5674 +#line 5739 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5674 +#line 5739 .heldItem = ITEM_ORAN_BERRY, -#line 5676 +#line 5741 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5675 +#line 5740 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5678 +#line 5743 [TRAINER_ISABEL_5] = { -#line 5679 +#line 5744 .trainerName = _("ISABEL"), -#line 5680 +#line 5745 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5681 +#line 5746 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 5682 +#line 5747 F_TRAINER_FEMALE | -#line 5683 +#line 5748 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5684 +#line 5749 .doubleBattle = FALSE, -#line 5685 +#line 5750 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5687 +#line 5752 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5687 +#line 5752 .heldItem = ITEM_SITRUS_BERRY, -#line 5689 +#line 5754 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5688 +#line 5753 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5691 +#line 5756 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5691 +#line 5756 .heldItem = ITEM_SITRUS_BERRY, -#line 5693 +#line 5758 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5692 +#line 5757 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5695 +#line 5760 [TRAINER_TIMOTHY_1] = { -#line 5696 +#line 5761 .trainerName = _("TIMOTHY"), -#line 5697 +#line 5762 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5698 +#line 5763 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 5700 +#line 5765 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5701 +#line 5766 .doubleBattle = FALSE, -#line 5702 +#line 5767 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5704 +#line 5769 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5706 +#line 5771 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5705 +#line 5770 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5708 +#line 5773 [TRAINER_TIMOTHY_2] = { -#line 5709 +#line 5774 .trainerName = _("TIMOTHY"), -#line 5710 +#line 5775 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5711 +#line 5776 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 5713 +#line 5778 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5714 +#line 5779 .doubleBattle = FALSE, -#line 5715 +#line 5780 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5717 +#line 5782 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5719 +#line 5784 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5718 +#line 5783 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5720 +#line 5785 MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, @@ -14342,37 +14342,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5725 +#line 5790 [TRAINER_TIMOTHY_3] = { -#line 5726 +#line 5791 .trainerName = _("TIMOTHY"), -#line 5727 +#line 5792 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5728 +#line 5793 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 5730 +#line 5795 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5731 +#line 5796 .doubleBattle = FALSE, -#line 5732 +#line 5797 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5734 +#line 5799 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5736 +#line 5801 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5735 +#line 5800 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5737 +#line 5802 MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, @@ -14381,37 +14381,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5742 +#line 5807 [TRAINER_TIMOTHY_4] = { -#line 5743 +#line 5808 .trainerName = _("TIMOTHY"), -#line 5744 +#line 5809 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5745 +#line 5810 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 5747 +#line 5812 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5748 +#line 5813 .doubleBattle = FALSE, -#line 5749 +#line 5814 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5751 +#line 5816 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5753 +#line 5818 .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5752 +#line 5817 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5754 +#line 5819 MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, @@ -14420,37 +14420,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 5759 +#line 5824 [TRAINER_TIMOTHY_5] = { -#line 5760 +#line 5825 .trainerName = _("TIMOTHY"), -#line 5761 +#line 5826 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5762 +#line 5827 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 5764 +#line 5829 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5765 +#line 5830 .doubleBattle = FALSE, -#line 5766 +#line 5831 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5768 +#line 5833 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5770 +#line 5835 .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5769 +#line 5834 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5771 +#line 5836 MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, @@ -14459,39 +14459,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 5776 +#line 5841 [TRAINER_VICKY] = { -#line 5777 +#line 5842 .trainerName = _("VICKY"), -#line 5778 +#line 5843 .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5779 +#line 5844 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5780 +#line 5845 F_TRAINER_FEMALE | -#line 5781 +#line 5846 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5782 +#line 5847 .doubleBattle = FALSE, -#line 5783 +#line 5848 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5785 +#line 5850 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5787 +#line 5852 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5786 +#line 5851 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5788 +#line 5853 MOVE_HIGH_JUMP_KICK, MOVE_MEDITATE, MOVE_CONFUSION, @@ -14500,448 +14500,448 @@ F_TRAINER_FEMALE | }, }, }, -#line 5793 +#line 5858 [TRAINER_SHELBY_1] = { -#line 5794 +#line 5859 .trainerName = _("SHELBY"), -#line 5795 +#line 5860 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5796 +#line 5861 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5797 +#line 5862 F_TRAINER_FEMALE | -#line 5798 +#line 5863 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5799 +#line 5864 .doubleBattle = FALSE, -#line 5800 +#line 5865 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5802 +#line 5867 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5804 +#line 5869 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5803 +#line 5868 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5806 +#line 5871 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5808 +#line 5873 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5807 +#line 5872 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5810 +#line 5875 [TRAINER_SHELBY_2] = { -#line 5811 +#line 5876 .trainerName = _("SHELBY"), -#line 5812 +#line 5877 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5813 +#line 5878 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5814 +#line 5879 F_TRAINER_FEMALE | -#line 5815 +#line 5880 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5816 +#line 5881 .doubleBattle = FALSE, -#line 5817 +#line 5882 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5819 +#line 5884 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5821 +#line 5886 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5820 +#line 5885 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5823 +#line 5888 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5825 +#line 5890 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5824 +#line 5889 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5827 +#line 5892 [TRAINER_SHELBY_3] = { -#line 5828 +#line 5893 .trainerName = _("SHELBY"), -#line 5829 +#line 5894 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5830 +#line 5895 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5831 +#line 5896 F_TRAINER_FEMALE | -#line 5832 +#line 5897 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5833 +#line 5898 .doubleBattle = FALSE, -#line 5834 +#line 5899 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5836 +#line 5901 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5838 +#line 5903 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5837 +#line 5902 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5840 +#line 5905 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5842 +#line 5907 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5841 +#line 5906 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5844 +#line 5909 [TRAINER_SHELBY_4] = { -#line 5845 +#line 5910 .trainerName = _("SHELBY"), -#line 5846 +#line 5911 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5847 +#line 5912 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5848 +#line 5913 F_TRAINER_FEMALE | -#line 5849 +#line 5914 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5850 +#line 5915 .doubleBattle = FALSE, -#line 5851 +#line 5916 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5853 +#line 5918 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5855 +#line 5920 .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5854 +#line 5919 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5857 +#line 5922 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5859 +#line 5924 .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5858 +#line 5923 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5861 +#line 5926 [TRAINER_SHELBY_5] = { -#line 5862 +#line 5927 .trainerName = _("SHELBY"), -#line 5863 +#line 5928 .trainerClass = TRAINER_CLASS_EXPERT, -#line 5864 +#line 5929 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 5865 +#line 5930 F_TRAINER_FEMALE | -#line 5866 +#line 5931 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5867 +#line 5932 .doubleBattle = FALSE, -#line 5868 +#line 5933 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5870 +#line 5935 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5872 +#line 5937 .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5871 +#line 5936 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5874 +#line 5939 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5876 +#line 5941 .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5875 +#line 5940 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5878 +#line 5943 [TRAINER_CALVIN_1] = { -#line 5879 +#line 5944 .trainerName = _("CALVIN"), -#line 5880 +#line 5945 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5881 +#line 5946 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5883 +#line 5948 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5884 +#line 5949 .doubleBattle = FALSE, -#line 5885 +#line 5950 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5887 +#line 5952 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5889 +#line 5954 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5888 +#line 5953 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5891 +#line 5956 [TRAINER_BILLY] = { -#line 5892 +#line 5957 .trainerName = _("BILLY"), -#line 5893 +#line 5958 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5894 +#line 5959 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5896 +#line 5961 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5897 +#line 5962 .doubleBattle = FALSE, -#line 5898 +#line 5963 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5900 +#line 5965 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5902 +#line 5967 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5901 +#line 5966 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5904 +#line 5969 .species = SPECIES_SEEDOT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5906 +#line 5971 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5905 +#line 5970 .lvl = 7, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5908 +#line 5973 [TRAINER_JOSH] = { -#line 5909 +#line 5974 .trainerName = _("JOSH"), -#line 5910 +#line 5975 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5911 +#line 5976 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5913 +#line 5978 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5914 +#line 5979 .doubleBattle = FALSE, -#line 5915 +#line 5980 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5917 +#line 5982 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5919 +#line 5984 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5918 +#line 5983 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5920 +#line 5985 MOVE_TACKLE, }, }, }, }, -#line 5922 +#line 5987 [TRAINER_TOMMY] = { -#line 5923 +#line 5988 .trainerName = _("TOMMY"), -#line 5924 +#line 5989 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5925 +#line 5990 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5927 +#line 5992 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5928 +#line 5993 .doubleBattle = FALSE, -#line 5929 +#line 5994 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5931 +#line 5996 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5933 +#line 5998 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 5932 +#line 5997 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 5935 +#line 6000 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5937 +#line 6002 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 5936 +#line 6001 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5939 +#line 6004 [TRAINER_JOEY] = { -#line 5940 +#line 6005 .trainerName = _("JOEY"), -#line 5941 +#line 6006 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5942 +#line 6007 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5944 +#line 6009 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5945 +#line 6010 .doubleBattle = FALSE, -#line 5946 +#line 6011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 5948 +#line 6013 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5950 +#line 6015 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5949 +#line 6014 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 5952 +#line 6017 [TRAINER_BEN] = { -#line 5953 +#line 6018 .trainerName = _("BEN"), -#line 5954 +#line 6019 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5955 +#line 6020 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 5957 +#line 6022 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5958 +#line 6023 .doubleBattle = FALSE, -#line 5959 +#line 6024 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5961 +#line 6026 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5963 +#line 6028 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 5962 +#line 6027 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5964 +#line 6029 MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_GROWL, @@ -14949,17 +14949,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5969 +#line 6034 .species = SPECIES_GULPIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5971 +#line 6036 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 5970 +#line 6035 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5972 +#line 6037 MOVE_AMNESIA, MOVE_SLUDGE, MOVE_YAWN, @@ -14968,39 +14968,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 5977 +#line 6042 [TRAINER_QUINCY] = { -#line 5978 +#line 6043 .trainerName = _("QUINCY"), -#line 5979 +#line 6044 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 5980 +#line 6045 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 5982 +#line 6047 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 5983 +#line 6048 .items = { ITEM_FULL_RESTORE }, -#line 5984 +#line 6049 .doubleBattle = FALSE, -#line 5985 +#line 6050 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 5987 +#line 6052 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5989 +#line 6054 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5988 +#line 6053 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5990 +#line 6055 MOVE_ATTRACT, MOVE_ICE_BEAM, MOVE_THUNDERBOLT, @@ -15008,17 +15008,17 @@ F_TRAINER_FEMALE | }, }, { -#line 5995 +#line 6060 .species = SPECIES_DUSCLOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 5997 +#line 6062 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5996 +#line 6061 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 5998 +#line 6063 MOVE_SKILL_SWAP, MOVE_PROTECT, MOVE_WILL_O_WISP, @@ -15027,41 +15027,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 6003 +#line 6068 [TRAINER_KATELYNN] = { -#line 6004 +#line 6069 .trainerName = _("KATELYNN"), -#line 6005 +#line 6070 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 6006 +#line 6071 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 6007 +#line 6072 F_TRAINER_FEMALE | -#line 6008 +#line 6073 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 6009 +#line 6074 .items = { ITEM_FULL_RESTORE }, -#line 6010 +#line 6075 .doubleBattle = FALSE, -#line 6011 +#line 6076 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6013 +#line 6078 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6015 +#line 6080 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6014 +#line 6079 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6016 +#line 6081 MOVE_SKILL_SWAP, MOVE_PSYCHIC, MOVE_THUNDERBOLT, @@ -15069,17 +15069,17 @@ F_TRAINER_FEMALE | }, }, { -#line 6021 +#line 6086 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6023 +#line 6088 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6022 +#line 6087 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6024 +#line 6089 MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_AERIAL_ACE, @@ -15088,418 +15088,418 @@ F_TRAINER_FEMALE | }, }, }, -#line 6029 +#line 6094 [TRAINER_JAYLEN] = { -#line 6030 +#line 6095 .trainerName = _("JAYLEN"), -#line 6031 +#line 6096 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6032 +#line 6097 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6034 +#line 6099 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6035 +#line 6100 .doubleBattle = FALSE, -#line 6036 +#line 6101 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6038 +#line 6103 .species = SPECIES_TRAPINCH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6040 +#line 6105 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6039 +#line 6104 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6042 +#line 6107 [TRAINER_DILLON] = { -#line 6043 +#line 6108 .trainerName = _("DILLON"), -#line 6044 +#line 6109 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6045 +#line 6110 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6047 +#line 6112 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6048 +#line 6113 .doubleBattle = FALSE, -#line 6049 +#line 6114 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6051 +#line 6116 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6053 +#line 6118 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6052 +#line 6117 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6055 +#line 6120 [TRAINER_CALVIN_2] = { -#line 6056 +#line 6121 .trainerName = _("CALVIN"), -#line 6057 +#line 6122 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6058 +#line 6123 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6060 +#line 6125 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6061 +#line 6126 .doubleBattle = FALSE, -#line 6062 +#line 6127 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6064 +#line 6129 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6066 +#line 6131 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6065 +#line 6130 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6068 +#line 6133 [TRAINER_CALVIN_3] = { -#line 6069 +#line 6134 .trainerName = _("CALVIN"), -#line 6070 +#line 6135 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6071 +#line 6136 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6073 +#line 6138 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6074 +#line 6139 .doubleBattle = FALSE, -#line 6075 +#line 6140 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6077 +#line 6142 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6079 +#line 6144 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6078 +#line 6143 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6081 +#line 6146 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6083 +#line 6148 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6082 +#line 6147 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6085 +#line 6150 [TRAINER_CALVIN_4] = { -#line 6086 +#line 6151 .trainerName = _("CALVIN"), -#line 6087 +#line 6152 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6088 +#line 6153 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6090 +#line 6155 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6091 +#line 6156 .doubleBattle = FALSE, -#line 6092 +#line 6157 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6094 +#line 6159 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6096 +#line 6161 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6095 +#line 6160 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6098 +#line 6163 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6100 +#line 6165 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6099 +#line 6164 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6102 +#line 6167 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6104 +#line 6169 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6103 +#line 6168 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6106 +#line 6171 [TRAINER_CALVIN_5] = { -#line 6107 +#line 6172 .trainerName = _("CALVIN"), -#line 6108 +#line 6173 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6109 +#line 6174 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6111 +#line 6176 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6112 +#line 6177 .doubleBattle = FALSE, -#line 6113 +#line 6178 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6115 +#line 6180 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6117 +#line 6182 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6116 +#line 6181 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6119 +#line 6184 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6121 +#line 6186 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6120 +#line 6185 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6123 +#line 6188 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6125 +#line 6190 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6124 +#line 6189 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6127 +#line 6192 [TRAINER_EDDIE] = { -#line 6128 +#line 6193 .trainerName = _("EDDIE"), -#line 6129 +#line 6194 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6130 +#line 6195 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6132 +#line 6197 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6133 +#line 6198 .doubleBattle = FALSE, -#line 6134 +#line 6199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6136 +#line 6201 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6138 +#line 6203 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6137 +#line 6202 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6140 +#line 6205 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6142 +#line 6207 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6141 +#line 6206 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6144 +#line 6209 [TRAINER_ALLEN] = { -#line 6145 +#line 6210 .trainerName = _("ALLEN"), -#line 6146 +#line 6211 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6147 +#line 6212 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6149 +#line 6214 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6150 +#line 6215 .doubleBattle = FALSE, -#line 6151 +#line 6216 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6153 +#line 6218 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6155 +#line 6220 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6154 +#line 6219 .lvl = 4, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6157 +#line 6222 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6159 +#line 6224 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6158 +#line 6223 .lvl = 3, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6161 +#line 6226 [TRAINER_TIMMY] = { -#line 6162 +#line 6227 .trainerName = _("TIMMY"), -#line 6163 +#line 6228 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6164 +#line 6229 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 6166 +#line 6231 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6167 +#line 6232 .doubleBattle = FALSE, -#line 6168 +#line 6233 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6170 +#line 6235 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6172 +#line 6237 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6171 +#line 6236 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6174 +#line 6239 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6176 +#line 6241 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6175 +#line 6240 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6178 +#line 6243 [TRAINER_WALLACE] = { -#line 6179 +#line 6244 .trainerName = _("WALLACE"), -#line 6180 +#line 6245 .trainerClass = TRAINER_CLASS_CHAMPION, -#line 6181 +#line 6246 .trainerPic = TRAINER_PIC_CHAMPION_WALLACE, .encounterMusic_gender = -#line 6183 +#line 6248 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6184 +#line 6249 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 6185 +#line 6250 .doubleBattle = FALSE, -#line 6186 +#line 6251 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, -#line 6187 +#line 6252 .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_YELLOW, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 6189 +#line 6254 .species = SPECIES_WAILORD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6191 +#line 6256 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6190 +#line 6255 .lvl = 57, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6192 +#line 6257 MOVE_RAIN_DANCE, MOVE_WATER_SPOUT, MOVE_DOUBLE_EDGE, @@ -15507,17 +15507,17 @@ F_TRAINER_FEMALE | }, }, { -#line 6197 +#line 6262 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6199 +#line 6264 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6198 +#line 6263 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6200 +#line 6265 MOVE_TOXIC, MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, @@ -15525,17 +15525,17 @@ F_TRAINER_FEMALE | }, }, { -#line 6205 +#line 6270 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6207 +#line 6272 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6206 +#line 6271 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6208 +#line 6273 MOVE_GIGA_DRAIN, MOVE_SURF, MOVE_LEECH_SEED, @@ -15543,17 +15543,17 @@ F_TRAINER_FEMALE | }, }, { -#line 6213 +#line 6278 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6215 +#line 6280 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6214 +#line 6279 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6216 +#line 6281 MOVE_EARTHQUAKE, MOVE_SURF, MOVE_AMNESIA, @@ -15561,17 +15561,17 @@ F_TRAINER_FEMALE | }, }, { -#line 6221 +#line 6286 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6223 +#line 6288 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6222 +#line 6287 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6224 +#line 6289 MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, @@ -15579,19 +15579,19 @@ F_TRAINER_FEMALE | }, }, { -#line 6229 +#line 6294 .species = SPECIES_MILOTIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6229 +#line 6294 .heldItem = ITEM_SITRUS_BERRY, -#line 6231 +#line 6296 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6230 +#line 6295 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 6232 +#line 6297 MOVE_RECOVER, MOVE_SURF, MOVE_ICE_BEAM, @@ -15600,1076 +15600,914 @@ F_TRAINER_FEMALE | }, }, }, -#line 6237 +#line 6302 [TRAINER_ANDREW] = { -#line 6238 +#line 6303 .trainerName = _("ANDREW"), -#line 6239 +#line 6304 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6240 +#line 6305 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6242 +#line 6307 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6243 +#line 6308 .doubleBattle = FALSE, -#line 6244 +#line 6309 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6246 +#line 6311 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6248 +#line 6313 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6247 +#line 6312 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6250 +#line 6315 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6252 +#line 6317 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6251 +#line 6316 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6254 +#line 6319 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6256 +#line 6321 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6255 +#line 6320 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6258 +#line 6323 [TRAINER_IVAN] = { -#line 6259 +#line 6324 .trainerName = _("IVAN"), -#line 6260 +#line 6325 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6261 +#line 6326 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6263 +#line 6328 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6264 +#line 6329 .doubleBattle = FALSE, -#line 6265 +#line 6330 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6267 +#line 6332 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6269 +#line 6334 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6268 +#line 6333 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6271 +#line 6336 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6273 +#line 6338 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6272 +#line 6337 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6275 +#line 6340 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6277 +#line 6342 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6276 +#line 6341 .lvl = 7, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6279 +#line 6344 [TRAINER_CLAUDE] = { -#line 6280 +#line 6345 .trainerName = _("CLAUDE"), -#line 6281 +#line 6346 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6282 +#line 6347 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6284 +#line 6349 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6285 +#line 6350 .doubleBattle = FALSE, -#line 6286 +#line 6351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6288 +#line 6353 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6290 +#line 6355 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6289 +#line 6354 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6292 +#line 6357 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6294 +#line 6359 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6293 +#line 6358 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6296 +#line 6361 .species = SPECIES_BARBOACH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6298 +#line 6363 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6297 +#line 6362 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6300 +#line 6365 [TRAINER_ELLIOT_1] = { -#line 6301 +#line 6366 .trainerName = _("ELLIOT"), -#line 6302 +#line 6367 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6303 +#line 6368 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6305 +#line 6370 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6306 +#line 6371 .doubleBattle = FALSE, -#line 6307 +#line 6372 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6309 +#line 6374 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6311 +#line 6376 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6310 +#line 6375 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6313 +#line 6378 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6315 +#line 6380 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6314 +#line 6379 .lvl = 7, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6317 +#line 6382 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6319 +#line 6384 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6318 +#line 6383 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6321 +#line 6386 [TRAINER_NED] = { -#line 6322 +#line 6387 .trainerName = _("NED"), -#line 6323 +#line 6388 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6324 +#line 6389 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6326 +#line 6391 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6327 +#line 6392 .doubleBattle = FALSE, -#line 6328 +#line 6393 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6330 +#line 6395 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6332 +#line 6397 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6331 +#line 6396 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6334 +#line 6399 [TRAINER_DALE] = { -#line 6335 +#line 6400 .trainerName = _("DALE"), -#line 6336 +#line 6401 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6337 +#line 6402 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6339 +#line 6404 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6340 +#line 6405 .doubleBattle = FALSE, -#line 6341 +#line 6406 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 6343 +#line 6408 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6345 +#line 6410 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6344 +#line 6409 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6347 +#line 6412 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6349 +#line 6414 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6348 +#line 6413 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6351 +#line 6416 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6353 +#line 6418 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6352 +#line 6417 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6355 +#line 6420 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6357 +#line 6422 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6356 +#line 6421 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6359 +#line 6424 [TRAINER_NOLAN] = { -#line 6360 +#line 6425 .trainerName = _("NOLAN"), -#line 6361 +#line 6426 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6362 +#line 6427 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6364 +#line 6429 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6365 +#line 6430 .doubleBattle = FALSE, -#line 6366 +#line 6431 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6368 +#line 6433 .species = SPECIES_BARBOACH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6370 +#line 6435 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6369 +#line 6434 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6372 +#line 6437 [TRAINER_BARNY] = { -#line 6373 +#line 6438 .trainerName = _("BARNY"), -#line 6374 +#line 6439 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6375 +#line 6440 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6377 +#line 6442 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6378 +#line 6443 .doubleBattle = FALSE, -#line 6379 +#line 6444 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6381 +#line 6446 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6383 +#line 6448 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6382 +#line 6447 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6385 +#line 6450 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6387 +#line 6452 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6386 +#line 6451 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6389 +#line 6454 [TRAINER_WADE] = { -#line 6390 +#line 6455 .trainerName = _("WADE"), -#line 6391 +#line 6456 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6392 +#line 6457 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6394 +#line 6459 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6395 +#line 6460 .doubleBattle = FALSE, -#line 6396 +#line 6461 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 6398 +#line 6463 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6400 +#line 6465 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6399 +#line 6464 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6402 +#line 6467 [TRAINER_CARTER] = { -#line 6403 +#line 6468 .trainerName = _("CARTER"), -#line 6404 +#line 6469 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6405 +#line 6470 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6407 +#line 6472 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6408 +#line 6473 .doubleBattle = FALSE, -#line 6409 +#line 6474 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6411 +#line 6476 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6413 +#line 6478 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6412 +#line 6477 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6415 +#line 6480 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6417 +#line 6482 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6416 +#line 6481 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6419 +#line 6484 [TRAINER_ELLIOT_2] = { -#line 6420 +#line 6485 .trainerName = _("ELLIOT"), -#line 6421 +#line 6486 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6422 +#line 6487 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6424 +#line 6489 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6425 +#line 6490 .doubleBattle = FALSE, -#line 6426 +#line 6491 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6428 +#line 6493 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6430 +#line 6495 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6429 +#line 6494 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6432 +#line 6497 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6434 +#line 6499 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6433 +#line 6498 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6436 +#line 6501 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6438 +#line 6503 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6437 +#line 6502 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6440 +#line 6505 [TRAINER_ELLIOT_3] = { -#line 6441 +#line 6506 .trainerName = _("ELLIOT"), -#line 6442 +#line 6507 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6443 +#line 6508 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6445 +#line 6510 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6446 +#line 6511 .doubleBattle = FALSE, -#line 6447 +#line 6512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 6449 +#line 6514 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6451 +#line 6516 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6450 +#line 6515 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6453 +#line 6518 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6455 +#line 6520 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6454 +#line 6519 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6457 +#line 6522 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6459 +#line 6524 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6458 +#line 6523 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6461 +#line 6526 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6463 +#line 6528 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6462 +#line 6527 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6465 +#line 6530 [TRAINER_ELLIOT_4] = { -#line 6466 +#line 6531 .trainerName = _("ELLIOT"), -#line 6467 +#line 6532 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6468 +#line 6533 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6470 +#line 6535 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6471 +#line 6536 .doubleBattle = FALSE, -#line 6472 +#line 6537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 6474 +#line 6539 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6476 +#line 6541 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6475 +#line 6540 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6478 +#line 6543 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6480 +#line 6545 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6479 +#line 6544 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6482 +#line 6547 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6484 +#line 6549 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6483 +#line 6548 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6486 +#line 6551 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6488 +#line 6553 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6487 +#line 6552 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6490 +#line 6555 [TRAINER_ELLIOT_5] = { -#line 6491 +#line 6556 .trainerName = _("ELLIOT"), -#line 6492 +#line 6557 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6493 +#line 6558 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6495 +#line 6560 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6496 +#line 6561 .doubleBattle = FALSE, -#line 6497 +#line 6562 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 6499 +#line 6564 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6501 +#line 6566 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6500 +#line 6565 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6503 +#line 6568 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6505 +#line 6570 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6504 +#line 6569 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6507 +#line 6572 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6509 +#line 6574 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6508 +#line 6573 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6511 +#line 6576 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6513 +#line 6578 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6512 +#line 6577 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6515 +#line 6580 [TRAINER_RONALD] = { -#line 6516 +#line 6581 .trainerName = _("RONALD"), -#line 6517 +#line 6582 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6518 +#line 6583 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 6520 +#line 6585 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6521 +#line 6586 .doubleBattle = FALSE, -#line 6522 +#line 6587 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 6524 +#line 6589 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6526 +#line 6591 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6525 +#line 6590 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6528 +#line 6593 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6530 +#line 6595 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6529 +#line 6594 .lvl = 21, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6532 +#line 6597 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6534 +#line 6599 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6533 +#line 6598 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6536 +#line 6601 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6538 +#line 6603 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6537 +#line 6602 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6540 +#line 6605 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6542 +#line 6607 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6541 +#line 6606 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6544 +#line 6609 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6546 +#line 6611 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6545 +#line 6610 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6548 +#line 6613 [TRAINER_JACOB] = { -#line 6549 +#line 6614 .trainerName = _("JACOB"), -#line 6550 +#line 6615 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6551 +#line 6616 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .encounterMusic_gender = -#line 6553 +#line 6618 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6554 +#line 6619 .doubleBattle = FALSE, -#line 6555 +#line 6620 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 6557 +#line 6622 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6559 +#line 6624 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6558 +#line 6623 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6561 +#line 6626 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6563 +#line 6628 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6562 +#line 6627 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6565 +#line 6630 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6567 +#line 6632 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 6566 +#line 6631 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6569 +#line 6634 [TRAINER_ANTHONY] = { -#line 6570 +#line 6635 .trainerName = _("ANTHONY"), -#line 6571 +#line 6636 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6572 +#line 6637 .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .encounterMusic_gender = -#line 6574 +#line 6639 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6575 +#line 6640 .doubleBattle = FALSE, -#line 6576 +#line 6641 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 6578 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6580 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6579 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6582 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6584 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6583 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6586 - [TRAINER_BENJAMIN_1] = - { -#line 6587 - .trainerName = _("BENJAMIN"), -#line 6588 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6589 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6591 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6592 - .doubleBattle = FALSE, -#line 6593 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6595 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6597 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6596 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6599 - [TRAINER_BENJAMIN_2] = - { -#line 6600 - .trainerName = _("BENJAMIN"), -#line 6601 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6602 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6604 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6605 - .doubleBattle = FALSE, -#line 6606 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6608 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6610 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6609 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6612 - [TRAINER_BENJAMIN_3] = - { -#line 6613 - .trainerName = _("BENJAMIN"), -#line 6614 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6615 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6617 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6618 - .doubleBattle = FALSE, -#line 6619 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6621 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6623 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6622 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6625 - [TRAINER_BENJAMIN_4] = - { -#line 6626 - .trainerName = _("BENJAMIN"), -#line 6627 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6628 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6630 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6631 - .doubleBattle = FALSE, -#line 6632 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6634 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6636 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6635 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6638 - [TRAINER_BENJAMIN_5] = - { -#line 6639 - .trainerName = _("BENJAMIN"), -#line 6640 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6641 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = #line 6643 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6644 - .doubleBattle = FALSE, + .species = SPECIES_MAGNEMITE, + .gender = TRAINER_MON_RANDOM_GENDER, #line 6645 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6644 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 6647 - .species = SPECIES_MAGNETON, + .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, #line 6649 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 6648 - .lvl = 39, + .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 6651 - [TRAINER_ABIGAIL_1] = + [TRAINER_BENJAMIN_1] = { #line 6652 - .trainerName = _("ABIGAIL"), + .trainerName = _("BENJAMIN"), #line 6653 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6654 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .encounterMusic_gender = -#line 6655 -F_TRAINER_FEMALE | #line 6656 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6657 .doubleBattle = FALSE, #line 6658 @@ -16691,24 +16529,22 @@ F_TRAINER_FEMALE | }, }, #line 6664 - [TRAINER_JASMINE] = + [TRAINER_BENJAMIN_2] = { #line 6665 - .trainerName = _("JASMINE"), + .trainerName = _("BENJAMIN"), #line 6666 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6667 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .encounterMusic_gender = -#line 6668 -F_TRAINER_FEMALE | #line 6669 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6670 .doubleBattle = FALSE, #line 6671 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, + .partySize = 1, .party = (const struct TrainerMon[]) { { @@ -16716,216 +16552,214 @@ F_TRAINER_FEMALE | .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, #line 6675 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), #line 6674 - .lvl = 14, + .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - { + }, + }, #line 6677 + [TRAINER_BENJAMIN_3] = + { +#line 6678 + .trainerName = _("BENJAMIN"), +#line 6679 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6680 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6682 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 6683 + .doubleBattle = FALSE, +#line 6684 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6686 .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6679 +#line 6688 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 6687 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6690 + [TRAINER_BENJAMIN_4] = + { +#line 6691 + .trainerName = _("BENJAMIN"), +#line 6692 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6693 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6695 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 6696 + .doubleBattle = FALSE, +#line 6697 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6699 + .species = SPECIES_MAGNETON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6701 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 6700 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6703 + [TRAINER_BENJAMIN_5] = + { +#line 6704 + .trainerName = _("BENJAMIN"), +#line 6705 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6706 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6708 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 6709 + .doubleBattle = FALSE, +#line 6710 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6712 + .species = SPECIES_MAGNETON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6714 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 6713 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6716 + [TRAINER_ABIGAIL_1] = + { +#line 6717 + .trainerName = _("ABIGAIL"), +#line 6718 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6719 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .encounterMusic_gender = +#line 6720 +F_TRAINER_FEMALE | +#line 6721 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6722 + .doubleBattle = FALSE, +#line 6723 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6725 + .species = SPECIES_MAGNEMITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6727 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6726 + .lvl = 16, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6729 + [TRAINER_JASMINE] = + { +#line 6730 + .trainerName = _("JASMINE"), +#line 6731 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6732 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .encounterMusic_gender = +#line 6733 +F_TRAINER_FEMALE | +#line 6734 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6735 + .doubleBattle = FALSE, +#line 6736 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 6738 + .species = SPECIES_MAGNEMITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6740 .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6678 +#line 6739 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 6681 +#line 6742 + .species = SPECIES_MAGNEMITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6744 + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), +#line 6743 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 6746 .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, -#line 6683 +#line 6748 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6682 +#line 6747 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6685 +#line 6750 [TRAINER_ABIGAIL_2] = { -#line 6686 - .trainerName = _("ABIGAIL"), -#line 6687 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6688 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6689 -F_TRAINER_FEMALE | -#line 6690 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6691 - .doubleBattle = FALSE, -#line 6692 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6694 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6696 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6695 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6698 - [TRAINER_ABIGAIL_3] = - { -#line 6699 - .trainerName = _("ABIGAIL"), -#line 6700 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6701 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6702 -F_TRAINER_FEMALE | -#line 6703 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6704 - .doubleBattle = FALSE, -#line 6705 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6707 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6709 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6708 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6711 - [TRAINER_ABIGAIL_4] = - { -#line 6712 - .trainerName = _("ABIGAIL"), -#line 6713 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6714 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6715 -F_TRAINER_FEMALE | -#line 6716 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6717 - .doubleBattle = FALSE, -#line 6718 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6720 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6722 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6721 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6724 - [TRAINER_ABIGAIL_5] = - { -#line 6725 - .trainerName = _("ABIGAIL"), -#line 6726 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6727 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6728 -F_TRAINER_FEMALE | -#line 6729 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6730 - .doubleBattle = FALSE, -#line 6731 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6733 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6735 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6734 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6737 - [TRAINER_DYLAN_1] = - { -#line 6738 - .trainerName = _("DYLAN"), -#line 6739 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6740 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6742 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6743 - .doubleBattle = FALSE, -#line 6744 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6746 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6748 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6747 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6750 - [TRAINER_DYLAN_2] = - { #line 6751 - .trainerName = _("DYLAN"), + .trainerName = _("ABIGAIL"), #line 6752 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6753 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = +#line 6754 +F_TRAINER_FEMALE | #line 6755 - TRAINER_ENCOUNTER_MUSIC_MALE, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6756 .doubleBattle = FALSE, #line 6757 @@ -16935,7 +16769,7 @@ F_TRAINER_FEMALE | { { #line 6759 - .species = SPECIES_DODUO, + .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, #line 6761 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), @@ -16947,17 +16781,19 @@ F_TRAINER_FEMALE | }, }, #line 6763 - [TRAINER_DYLAN_3] = + [TRAINER_ABIGAIL_3] = { #line 6764 - .trainerName = _("DYLAN"), + .trainerName = _("ABIGAIL"), #line 6765 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6766 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = +#line 6767 +F_TRAINER_FEMALE | #line 6768 - TRAINER_ENCOUNTER_MUSIC_MALE, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6769 .doubleBattle = FALSE, #line 6770 @@ -16967,7 +16803,7 @@ F_TRAINER_FEMALE | { { #line 6772 - .species = SPECIES_DODUO, + .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, #line 6774 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), @@ -16979,17 +16815,19 @@ F_TRAINER_FEMALE | }, }, #line 6776 - [TRAINER_DYLAN_4] = + [TRAINER_ABIGAIL_4] = { #line 6777 - .trainerName = _("DYLAN"), + .trainerName = _("ABIGAIL"), #line 6778 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6779 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = +#line 6780 +F_TRAINER_FEMALE | #line 6781 - TRAINER_ENCOUNTER_MUSIC_MALE, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6782 .doubleBattle = FALSE, #line 6783 @@ -16999,7 +16837,7 @@ F_TRAINER_FEMALE | { { #line 6785 - .species = SPECIES_DODRIO, + .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, #line 6787 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), @@ -17011,17 +16849,19 @@ F_TRAINER_FEMALE | }, }, #line 6789 - [TRAINER_DYLAN_5] = + [TRAINER_ABIGAIL_5] = { #line 6790 - .trainerName = _("DYLAN"), + .trainerName = _("ABIGAIL"), #line 6791 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6792 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = +#line 6793 +F_TRAINER_FEMALE | #line 6794 - TRAINER_ENCOUNTER_MUSIC_MALE, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6795 .doubleBattle = FALSE, #line 6796 @@ -17031,7 +16871,7 @@ F_TRAINER_FEMALE | { { #line 6798 - .species = SPECIES_DODRIO, + .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, #line 6800 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), @@ -17043,19 +16883,17 @@ F_TRAINER_FEMALE | }, }, #line 6802 - [TRAINER_MARIA_1] = + [TRAINER_DYLAN_1] = { #line 6803 - .trainerName = _("MARIA"), + .trainerName = _("DYLAN"), #line 6804 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6805 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .encounterMusic_gender = -#line 6806 -F_TRAINER_FEMALE | #line 6807 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6808 .doubleBattle = FALSE, #line 6809 @@ -17077,19 +16915,17 @@ F_TRAINER_FEMALE | }, }, #line 6815 - [TRAINER_MARIA_2] = + [TRAINER_DYLAN_2] = { #line 6816 - .trainerName = _("MARIA"), + .trainerName = _("DYLAN"), #line 6817 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6818 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .encounterMusic_gender = -#line 6819 -F_TRAINER_FEMALE | #line 6820 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6821 .doubleBattle = FALSE, #line 6822 @@ -17111,19 +16947,17 @@ F_TRAINER_FEMALE | }, }, #line 6828 - [TRAINER_MARIA_3] = + [TRAINER_DYLAN_3] = { #line 6829 - .trainerName = _("MARIA"), + .trainerName = _("DYLAN"), #line 6830 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6831 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .encounterMusic_gender = -#line 6832 -F_TRAINER_FEMALE | #line 6833 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6834 .doubleBattle = FALSE, #line 6835 @@ -17145,19 +16979,17 @@ F_TRAINER_FEMALE | }, }, #line 6841 - [TRAINER_MARIA_4] = + [TRAINER_DYLAN_4] = { #line 6842 - .trainerName = _("MARIA"), + .trainerName = _("DYLAN"), #line 6843 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6844 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .encounterMusic_gender = -#line 6845 -F_TRAINER_FEMALE | #line 6846 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6847 .doubleBattle = FALSE, #line 6848 @@ -17179,19 +17011,17 @@ F_TRAINER_FEMALE | }, }, #line 6854 - [TRAINER_MARIA_5] = + [TRAINER_DYLAN_5] = { #line 6855 - .trainerName = _("MARIA"), + .trainerName = _("DYLAN"), #line 6856 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6857 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, .encounterMusic_gender = -#line 6858 -F_TRAINER_FEMALE | #line 6859 - TRAINER_ENCOUNTER_MUSIC_FEMALE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 6860 .doubleBattle = FALSE, #line 6861 @@ -17213,364 +17043,372 @@ F_TRAINER_FEMALE | }, }, #line 6867 - [TRAINER_CAMDEN] = + [TRAINER_MARIA_1] = { #line 6868 - .trainerName = _("CAMDEN"), + .trainerName = _("MARIA"), #line 6869 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 6870 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = +#line 6871 +F_TRAINER_FEMALE | #line 6872 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6873 .doubleBattle = FALSE, #line 6874 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6876 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6878 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6877 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6880 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6882 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6881 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6884 - [TRAINER_DEMETRIUS] = - { -#line 6885 - .trainerName = _("DEMETRIUS"), -#line 6886 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6887 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6889 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6890 - .doubleBattle = FALSE, -#line 6891 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6893 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6895 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6894 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6897 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6899 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6898 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6901 - [TRAINER_ISAIAH_1] = - { -#line 6902 - .trainerName = _("ISAIAH"), -#line 6903 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6904 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6906 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6907 - .doubleBattle = FALSE, -#line 6908 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { +#line 6876 + .species = SPECIES_DODUO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6878 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6877 + .lvl = 17, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6880 + [TRAINER_MARIA_2] = + { +#line 6881 + .trainerName = _("MARIA"), +#line 6882 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6883 + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .encounterMusic_gender = +#line 6884 +F_TRAINER_FEMALE | +#line 6885 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6886 + .doubleBattle = FALSE, +#line 6887 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6889 + .species = SPECIES_DODUO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6891 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 6890 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6893 + [TRAINER_MARIA_3] = + { +#line 6894 + .trainerName = _("MARIA"), +#line 6895 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6896 + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .encounterMusic_gender = +#line 6897 +F_TRAINER_FEMALE | +#line 6898 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6899 + .doubleBattle = FALSE, +#line 6900 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6902 + .species = SPECIES_DODUO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6904 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 6903 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6906 + [TRAINER_MARIA_4] = + { +#line 6907 + .trainerName = _("MARIA"), +#line 6908 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6909 + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .encounterMusic_gender = #line 6910 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6912 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +F_TRAINER_FEMALE | #line 6911 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6914 - [TRAINER_PABLO_1] = - { + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6912 + .doubleBattle = FALSE, +#line 6913 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { #line 6915 - .trainerName = _("PABLO"), -#line 6916 - .trainerClass = TRAINER_CLASS_TRIATHLETE, + .species = SPECIES_DODRIO, + .gender = TRAINER_MON_RANDOM_GENDER, #line 6917 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6919 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6920 - .doubleBattle = FALSE, -#line 6921 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6923 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6925 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6924 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6927 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6929 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6928 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6931 - [TRAINER_CHASE] = - { -#line 6932 - .trainerName = _("CHASE"), -#line 6933 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6934 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6936 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6937 - .doubleBattle = FALSE, -#line 6938 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6940 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6942 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6941 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6944 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6946 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6945 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 6916 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 6948 - [TRAINER_ISAIAH_2] = +#line 6919 + [TRAINER_MARIA_5] = { -#line 6949 - .trainerName = _("ISAIAH"), -#line 6950 +#line 6920 + .trainerName = _("MARIA"), +#line 6921 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6951 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, +#line 6922 + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = -#line 6953 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6954 - .doubleBattle = FALSE, -#line 6955 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6957 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6959 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6958 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6961 - [TRAINER_ISAIAH_3] = - { -#line 6962 - .trainerName = _("ISAIAH"), -#line 6963 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6964 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6966 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6967 - .doubleBattle = FALSE, -#line 6968 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6970 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6972 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6971 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6974 - [TRAINER_ISAIAH_4] = - { -#line 6975 - .trainerName = _("ISAIAH"), -#line 6976 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6977 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6979 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6980 - .doubleBattle = FALSE, -#line 6981 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6983 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6985 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6984 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6987 - [TRAINER_ISAIAH_5] = - { -#line 6988 - .trainerName = _("ISAIAH"), -#line 6989 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6990 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6992 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6993 - .doubleBattle = FALSE, -#line 6994 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6996 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6998 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6997 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7000 - [TRAINER_ISOBEL] = - { -#line 7001 - .trainerName = _("ISOBEL"), -#line 7002 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7003 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7004 +#line 6923 F_TRAINER_FEMALE | -#line 7005 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7006 +#line 6924 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 6925 .doubleBattle = FALSE, -#line 7007 +#line 6926 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { +#line 6928 + .species = SPECIES_DODRIO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6930 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 6929 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6932 + [TRAINER_CAMDEN] = + { +#line 6933 + .trainerName = _("CAMDEN"), +#line 6934 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6935 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6937 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 6938 + .doubleBattle = FALSE, +#line 6939 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 6941 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6943 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6942 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 6945 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6947 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6946 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6949 + [TRAINER_DEMETRIUS] = + { +#line 6950 + .trainerName = _("DEMETRIUS"), +#line 6951 + .trainerClass = TRAINER_CLASS_YOUNGSTER, +#line 6952 + .trainerPic = TRAINER_PIC_YOUNGSTER, + .encounterMusic_gender = +#line 6954 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 6955 + .doubleBattle = FALSE, +#line 6956 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 6958 + .species = SPECIES_ZIGZAGOON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6960 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6959 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 6962 + .species = SPECIES_ELECTRIKE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6964 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6963 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6966 + [TRAINER_ISAIAH_1] = + { +#line 6967 + .trainerName = _("ISAIAH"), +#line 6968 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6969 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6971 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 6972 + .doubleBattle = FALSE, +#line 6973 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 6975 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6977 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6976 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6979 + [TRAINER_PABLO_1] = + { +#line 6980 + .trainerName = _("PABLO"), +#line 6981 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6982 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .encounterMusic_gender = +#line 6984 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 6985 + .doubleBattle = FALSE, +#line 6986 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 6988 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6990 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6989 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 6992 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 6994 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 6993 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 6996 + [TRAINER_CHASE] = + { +#line 6997 + .trainerName = _("CHASE"), +#line 6998 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 6999 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .encounterMusic_gender = +#line 7001 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7002 + .doubleBattle = FALSE, +#line 7003 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7005 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7007 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7006 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 7009 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, #line 7011 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), #line 7010 .lvl = 34, .nature = NATURE_HARDY, @@ -17579,569 +17417,731 @@ F_TRAINER_FEMALE | }, }, #line 7013 - [TRAINER_DONNY] = + [TRAINER_ISAIAH_2] = { #line 7014 - .trainerName = _("DONNY"), + .trainerName = _("ISAIAH"), #line 7015 .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 7016 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 7017 -F_TRAINER_FEMALE | #line 7018 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7019 .doubleBattle = FALSE, #line 7020 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .partySize = 1, .party = (const struct TrainerMon[]) { { #line 7022 - .species = SPECIES_WINGULL, + .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, #line 7024 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7023 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7026 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7028 - .iv = TRAINER_PARTY_IVS(19, 19, 19, 19, 19, 19), -#line 7027 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7030 - [TRAINER_TALIA] = - { -#line 7031 - .trainerName = _("TALIA"), -#line 7032 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7033 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7034 -F_TRAINER_FEMALE | -#line 7035 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7036 - .doubleBattle = FALSE, -#line 7037 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7039 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7041 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7040 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7043 - [TRAINER_KATELYN_1] = - { -#line 7044 - .trainerName = _("KATELYN"), -#line 7045 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7046 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7047 -F_TRAINER_FEMALE | -#line 7048 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7049 - .doubleBattle = FALSE, -#line 7050 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7052 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7054 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7053 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7056 - [TRAINER_ALLISON] = - { -#line 7057 - .trainerName = _("ALLISON"), -#line 7058 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7059 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7060 -F_TRAINER_FEMALE | -#line 7061 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7062 - .doubleBattle = FALSE, -#line 7063 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7065 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7067 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7066 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7069 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7071 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 7070 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7073 - [TRAINER_KATELYN_2] = - { -#line 7074 - .trainerName = _("KATELYN"), -#line 7075 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7076 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7077 -F_TRAINER_FEMALE | -#line 7078 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7079 - .doubleBattle = FALSE, -#line 7080 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7082 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7084 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7083 +#line 7023 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7086 - [TRAINER_KATELYN_3] = +#line 7026 + [TRAINER_ISAIAH_3] = { -#line 7087 - .trainerName = _("KATELYN"), -#line 7088 +#line 7027 + .trainerName = _("ISAIAH"), +#line 7028 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7089 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, +#line 7029 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 7090 -F_TRAINER_FEMALE | -#line 7091 +#line 7031 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7092 +#line 7032 .doubleBattle = FALSE, -#line 7093 +#line 7033 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7095 +#line 7035 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7097 +#line 7037 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7096 +#line 7036 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7099 - [TRAINER_KATELYN_4] = +#line 7039 + [TRAINER_ISAIAH_4] = { -#line 7100 - .trainerName = _("KATELYN"), -#line 7101 +#line 7040 + .trainerName = _("ISAIAH"), +#line 7041 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7102 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, +#line 7042 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 7103 -F_TRAINER_FEMALE | -#line 7104 +#line 7044 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7105 +#line 7045 .doubleBattle = FALSE, -#line 7106 +#line 7046 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7108 +#line 7048 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7110 +#line 7050 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7109 +#line 7049 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7112 - [TRAINER_KATELYN_5] = +#line 7052 + [TRAINER_ISAIAH_5] = { -#line 7113 - .trainerName = _("KATELYN"), -#line 7114 +#line 7053 + .trainerName = _("ISAIAH"), +#line 7054 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7115 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, +#line 7055 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 7116 -F_TRAINER_FEMALE | -#line 7117 +#line 7057 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7118 +#line 7058 .doubleBattle = FALSE, -#line 7119 +#line 7059 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7121 +#line 7061 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7123 +#line 7063 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7122 +#line 7062 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7125 - [TRAINER_NICOLAS_1] = +#line 7065 + [TRAINER_ISOBEL] = { -#line 7126 - .trainerName = _("NICOLAS"), -#line 7127 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7128 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, +#line 7066 + .trainerName = _("ISOBEL"), +#line 7067 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7068 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, .encounterMusic_gender = -#line 7130 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7131 +#line 7069 +F_TRAINER_FEMALE | +#line 7070 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7071 .doubleBattle = FALSE, -#line 7132 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7134 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7136 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7135 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7138 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7140 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7139 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7142 - [TRAINER_NICOLAS_2] = - { -#line 7143 - .trainerName = _("NICOLAS"), -#line 7144 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7145 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7147 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7148 - .doubleBattle = FALSE, -#line 7149 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7151 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7153 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7152 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7155 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7157 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7156 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7159 - [TRAINER_NICOLAS_3] = - { -#line 7160 - .trainerName = _("NICOLAS"), -#line 7161 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7162 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7164 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7165 - .doubleBattle = FALSE, -#line 7166 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7168 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7170 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7169 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7172 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7174 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7173 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7176 - [TRAINER_NICOLAS_4] = - { -#line 7177 - .trainerName = _("NICOLAS"), -#line 7178 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7179 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7181 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7182 - .doubleBattle = FALSE, -#line 7183 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7185 - .species = SPECIES_BAGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7187 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7186 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7189 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7191 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7190 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7193 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7195 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7194 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7197 - [TRAINER_NICOLAS_5] = - { -#line 7198 - .trainerName = _("NICOLAS"), -#line 7199 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7200 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7202 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7203 - .doubleBattle = FALSE, -#line 7204 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7206 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7208 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7207 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7210 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7212 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7211 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7214 - .species = SPECIES_SHELGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7214 - .heldItem = ITEM_DRAGON_FANG, -#line 7216 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7215 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7218 - [TRAINER_AARON] = - { -#line 7219 - .trainerName = _("AARON"), -#line 7220 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7221 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7223 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7224 - .doubleBattle = FALSE, -#line 7225 +#line 7072 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { +#line 7074 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7076 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7075 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7078 + [TRAINER_DONNY] = + { +#line 7079 + .trainerName = _("DONNY"), +#line 7080 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7081 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7082 +F_TRAINER_FEMALE | +#line 7083 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7084 + .doubleBattle = FALSE, +#line 7085 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7087 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7089 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7088 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7091 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7093 + .iv = TRAINER_PARTY_IVS(19, 19, 19, 19, 19, 19), +#line 7092 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7095 + [TRAINER_TALIA] = + { +#line 7096 + .trainerName = _("TALIA"), +#line 7097 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7098 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7099 +F_TRAINER_FEMALE | +#line 7100 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7101 + .doubleBattle = FALSE, +#line 7102 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7104 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7106 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7105 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7108 + [TRAINER_KATELYN_1] = + { +#line 7109 + .trainerName = _("KATELYN"), +#line 7110 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7111 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7112 +F_TRAINER_FEMALE | +#line 7113 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7114 + .doubleBattle = FALSE, +#line 7115 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7117 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7119 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7118 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7121 + [TRAINER_ALLISON] = + { +#line 7122 + .trainerName = _("ALLISON"), +#line 7123 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7124 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7125 +F_TRAINER_FEMALE | +#line 7126 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7127 + .doubleBattle = FALSE, +#line 7128 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7130 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7132 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7131 + .lvl = 27, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7134 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7136 + .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), +#line 7135 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7138 + [TRAINER_KATELYN_2] = + { +#line 7139 + .trainerName = _("KATELYN"), +#line 7140 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7141 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7142 +F_TRAINER_FEMALE | +#line 7143 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7144 + .doubleBattle = FALSE, +#line 7145 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7147 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7149 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 7148 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7151 + [TRAINER_KATELYN_3] = + { +#line 7152 + .trainerName = _("KATELYN"), +#line 7153 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7154 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7155 +F_TRAINER_FEMALE | +#line 7156 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7157 + .doubleBattle = FALSE, +#line 7158 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7160 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7162 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 7161 + .lvl = 42, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7164 + [TRAINER_KATELYN_4] = + { +#line 7165 + .trainerName = _("KATELYN"), +#line 7166 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7167 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7168 +F_TRAINER_FEMALE | +#line 7169 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7170 + .doubleBattle = FALSE, +#line 7171 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7173 + .species = SPECIES_STARMIE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7175 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 7174 + .lvl = 45, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7177 + [TRAINER_KATELYN_5] = + { +#line 7178 + .trainerName = _("KATELYN"), +#line 7179 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 7180 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 7181 +F_TRAINER_FEMALE | +#line 7182 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 7183 + .doubleBattle = FALSE, +#line 7184 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7186 + .species = SPECIES_STARMIE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7188 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7187 + .lvl = 48, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7190 + [TRAINER_NICOLAS_1] = + { +#line 7191 + .trainerName = _("NICOLAS"), +#line 7192 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, +#line 7193 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7195 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7196 + .doubleBattle = FALSE, +#line 7197 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7199 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7201 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 7200 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7203 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7205 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 7204 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7207 + [TRAINER_NICOLAS_2] = + { +#line 7208 + .trainerName = _("NICOLAS"), +#line 7209 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, +#line 7210 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7212 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7213 + .doubleBattle = FALSE, +#line 7214 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7216 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7218 + .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), +#line 7217 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7220 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7222 + .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), +#line 7221 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7224 + [TRAINER_NICOLAS_3] = + { +#line 7225 + .trainerName = _("NICOLAS"), +#line 7226 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, #line 7227 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7229 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7230 + .doubleBattle = FALSE, +#line 7231 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 7233 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7235 + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), +#line 7234 + .lvl = 44, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7237 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7239 + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), +#line 7238 + .lvl = 44, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7241 + [TRAINER_NICOLAS_4] = + { +#line 7242 + .trainerName = _("NICOLAS"), +#line 7243 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, +#line 7244 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7246 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7247 + .doubleBattle = FALSE, +#line 7248 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 7250 .species = SPECIES_BAGON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7229 +#line 7252 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 7251 + .lvl = 46, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7254 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7256 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 7255 + .lvl = 46, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7258 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7260 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 7259 + .lvl = 46, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7262 + [TRAINER_NICOLAS_5] = + { +#line 7263 + .trainerName = _("NICOLAS"), +#line 7264 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, +#line 7265 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7267 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7268 + .doubleBattle = FALSE, +#line 7269 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 7271 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7273 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 7272 + .lvl = 49, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7275 + .species = SPECIES_ALTARIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7277 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 7276 + .lvl = 49, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 7279 + .species = SPECIES_SHELGON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7279 + .heldItem = ITEM_DRAGON_FANG, +#line 7281 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 7280 + .lvl = 49, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7283 + [TRAINER_AARON] = + { +#line 7284 + .trainerName = _("AARON"), +#line 7285 + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, +#line 7286 + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .encounterMusic_gender = +#line 7288 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7289 + .doubleBattle = FALSE, +#line 7290 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7292 + .species = SPECIES_BAGON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7294 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 7228 +#line 7293 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7230 +#line 7295 MOVE_DRAGON_BREATH, MOVE_HEADBUTT, MOVE_FOCUS_ENERGY, @@ -18150,895 +18150,895 @@ F_TRAINER_FEMALE | }, }, }, -#line 7235 +#line 7300 [TRAINER_PERRY] = { -#line 7236 +#line 7301 .trainerName = _("PERRY"), -#line 7237 +#line 7302 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7238 +#line 7303 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7240 +#line 7305 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7241 +#line 7306 .doubleBattle = FALSE, -#line 7242 +#line 7307 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7244 +#line 7309 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7246 +#line 7311 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7245 +#line 7310 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7248 +#line 7313 [TRAINER_HUGH] = { -#line 7249 +#line 7314 .trainerName = _("HUGH"), -#line 7250 +#line 7315 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7251 +#line 7316 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7253 +#line 7318 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7254 +#line 7319 .doubleBattle = FALSE, -#line 7255 +#line 7320 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7257 +#line 7322 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7259 +#line 7324 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7258 +#line 7323 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7261 +#line 7326 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7263 +#line 7328 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7262 +#line 7327 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7265 +#line 7330 [TRAINER_PHIL] = { -#line 7266 +#line 7331 .trainerName = _("PHIL"), -#line 7267 +#line 7332 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7268 +#line 7333 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7270 +#line 7335 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7271 +#line 7336 .doubleBattle = FALSE, -#line 7272 +#line 7337 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7274 +#line 7339 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7276 +#line 7341 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7275 +#line 7340 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7278 +#line 7343 [TRAINER_JARED] = { -#line 7279 +#line 7344 .trainerName = _("JARED"), -#line 7280 +#line 7345 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7281 +#line 7346 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7283 +#line 7348 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7284 +#line 7349 .doubleBattle = FALSE, -#line 7285 +#line 7350 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 7287 +#line 7352 .species = SPECIES_DODUO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7289 +#line 7354 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7288 +#line 7353 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7291 +#line 7356 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7293 +#line 7358 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7292 +#line 7357 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7295 +#line 7360 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7297 +#line 7362 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7296 +#line 7361 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7299 +#line 7364 [TRAINER_HUMBERTO] = { -#line 7300 +#line 7365 .trainerName = _("HUMBERTO"), -#line 7301 +#line 7366 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7302 +#line 7367 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7304 +#line 7369 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7305 +#line 7370 .doubleBattle = FALSE, -#line 7306 +#line 7371 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7308 +#line 7373 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7310 +#line 7375 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 7309 +#line 7374 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7312 +#line 7377 [TRAINER_PRESLEY] = { -#line 7313 +#line 7378 .trainerName = _("PRESLEY"), -#line 7314 +#line 7379 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7315 +#line 7380 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7317 +#line 7382 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7318 +#line 7383 .doubleBattle = FALSE, -#line 7319 +#line 7384 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7321 +#line 7386 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7323 +#line 7388 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7322 +#line 7387 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7325 +#line 7390 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7327 +#line 7392 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7326 +#line 7391 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7329 +#line 7394 [TRAINER_EDWARDO] = { -#line 7330 +#line 7395 .trainerName = _("EDWARDO"), -#line 7331 +#line 7396 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7332 +#line 7397 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7334 +#line 7399 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7335 +#line 7400 .doubleBattle = FALSE, -#line 7336 +#line 7401 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7338 +#line 7403 .species = SPECIES_DODUO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7340 +#line 7405 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7339 +#line 7404 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7342 +#line 7407 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7344 +#line 7409 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7343 +#line 7408 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7346 +#line 7411 [TRAINER_COLIN] = { -#line 7347 +#line 7412 .trainerName = _("COLIN"), -#line 7348 +#line 7413 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7349 +#line 7414 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7351 +#line 7416 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7352 +#line 7417 .doubleBattle = FALSE, -#line 7353 +#line 7418 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7355 +#line 7420 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7357 +#line 7422 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7356 +#line 7421 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7359 +#line 7424 .species = SPECIES_NATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7361 +#line 7426 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7360 +#line 7425 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7363 +#line 7428 [TRAINER_ROBERT_1] = { -#line 7364 +#line 7429 .trainerName = _("ROBERT"), -#line 7365 +#line 7430 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7366 +#line 7431 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7368 +#line 7433 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7369 +#line 7434 .doubleBattle = FALSE, -#line 7370 +#line 7435 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7372 +#line 7437 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7374 +#line 7439 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7373 +#line 7438 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7376 +#line 7441 [TRAINER_BENNY] = { -#line 7377 +#line 7442 .trainerName = _("BENNY"), -#line 7378 +#line 7443 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7379 +#line 7444 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7381 +#line 7446 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7382 +#line 7447 .doubleBattle = FALSE, -#line 7383 +#line 7448 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 7385 +#line 7450 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7387 +#line 7452 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7386 +#line 7451 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7389 +#line 7454 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7391 +#line 7456 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7390 +#line 7455 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7393 +#line 7458 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7395 +#line 7460 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7394 +#line 7459 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7397 +#line 7462 [TRAINER_CHESTER] = { -#line 7398 +#line 7463 .trainerName = _("CHESTER"), -#line 7399 +#line 7464 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7400 +#line 7465 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7402 +#line 7467 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7403 +#line 7468 .doubleBattle = FALSE, -#line 7404 +#line 7469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7406 +#line 7471 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7408 +#line 7473 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7407 +#line 7472 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7410 +#line 7475 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7412 +#line 7477 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7411 +#line 7476 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7414 +#line 7479 [TRAINER_ROBERT_2] = { -#line 7415 +#line 7480 .trainerName = _("ROBERT"), -#line 7416 +#line 7481 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7417 +#line 7482 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7419 +#line 7484 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7420 +#line 7485 .doubleBattle = FALSE, -#line 7421 +#line 7486 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7423 +#line 7488 .species = SPECIES_NATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7425 +#line 7490 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7424 +#line 7489 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7427 +#line 7492 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7429 +#line 7494 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7428 +#line 7493 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7431 +#line 7496 [TRAINER_ROBERT_3] = { -#line 7432 +#line 7497 .trainerName = _("ROBERT"), -#line 7433 +#line 7498 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7434 +#line 7499 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7436 +#line 7501 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7437 +#line 7502 .doubleBattle = FALSE, -#line 7438 +#line 7503 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7440 +#line 7505 .species = SPECIES_NATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7442 +#line 7507 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7441 +#line 7506 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7444 +#line 7509 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7446 +#line 7511 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7445 +#line 7510 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7448 +#line 7513 [TRAINER_ROBERT_4] = { -#line 7449 +#line 7514 .trainerName = _("ROBERT"), -#line 7450 +#line 7515 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7451 +#line 7516 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7453 +#line 7518 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7454 +#line 7519 .doubleBattle = FALSE, -#line 7455 +#line 7520 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7457 +#line 7522 .species = SPECIES_NATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7459 +#line 7524 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7458 +#line 7523 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7461 +#line 7526 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7463 +#line 7528 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7462 +#line 7527 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7465 +#line 7530 [TRAINER_ROBERT_5] = { -#line 7466 +#line 7531 .trainerName = _("ROBERT"), -#line 7467 +#line 7532 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7468 +#line 7533 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7470 +#line 7535 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7471 +#line 7536 .doubleBattle = FALSE, -#line 7472 +#line 7537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7474 +#line 7539 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7476 +#line 7541 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7475 +#line 7540 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7478 +#line 7543 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7480 +#line 7545 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7479 +#line 7544 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7482 +#line 7547 [TRAINER_ALEX] = { -#line 7483 +#line 7548 .trainerName = _("ALEX"), -#line 7484 +#line 7549 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7485 +#line 7550 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7487 +#line 7552 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7488 +#line 7553 .doubleBattle = FALSE, -#line 7489 +#line 7554 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7491 +#line 7556 .species = SPECIES_NATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7493 +#line 7558 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7492 +#line 7557 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7495 +#line 7560 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7497 +#line 7562 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7496 +#line 7561 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7499 +#line 7564 [TRAINER_BECK] = { -#line 7500 +#line 7565 .trainerName = _("BECK"), -#line 7501 +#line 7566 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7502 +#line 7567 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 7504 +#line 7569 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7505 +#line 7570 .doubleBattle = FALSE, -#line 7506 +#line 7571 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7508 +#line 7573 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7510 +#line 7575 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7509 +#line 7574 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7512 +#line 7577 [TRAINER_YASU] = { -#line 7513 +#line 7578 .trainerName = _("YASU"), -#line 7514 +#line 7579 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7515 +#line 7580 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7517 +#line 7582 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7518 +#line 7583 .doubleBattle = FALSE, -#line 7519 +#line 7584 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7521 +#line 7586 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7523 +#line 7588 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7522 +#line 7587 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7525 +#line 7590 [TRAINER_TAKASHI] = { -#line 7526 +#line 7591 .trainerName = _("TAKASHI"), -#line 7527 +#line 7592 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7528 +#line 7593 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7530 +#line 7595 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7531 +#line 7596 .doubleBattle = FALSE, -#line 7532 +#line 7597 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7534 +#line 7599 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7536 +#line 7601 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7535 +#line 7600 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7538 +#line 7603 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7540 +#line 7605 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7539 +#line 7604 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7542 +#line 7607 [TRAINER_DIANNE] = { -#line 7543 +#line 7608 .trainerName = _("DIANNE"), -#line 7544 +#line 7609 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 7545 +#line 7610 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 7546 +#line 7611 F_TRAINER_FEMALE | -#line 7547 +#line 7612 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7548 +#line 7613 .items = { ITEM_FULL_RESTORE }, -#line 7549 +#line 7614 .doubleBattle = FALSE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7551 +#line 7616 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7553 +#line 7618 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7552 +#line 7617 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7554 +#line 7619 MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, }, }, { -#line 7557 +#line 7622 .species = SPECIES_LANTURN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7559 +#line 7624 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7558 +#line 7623 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7560 +#line 7625 MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, }, }, }, }, -#line 7563 +#line 7628 [TRAINER_JANI] = { -#line 7564 +#line 7629 .trainerName = _("JANI"), -#line 7565 +#line 7630 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 7566 +#line 7631 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 7567 +#line 7632 F_TRAINER_FEMALE | -#line 7568 +#line 7633 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 7569 +#line 7634 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7571 +#line 7636 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7573 +#line 7638 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7572 +#line 7637 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7575 +#line 7640 [TRAINER_LAO_1] = { -#line 7576 +#line 7641 .trainerName = _("LAO"), -#line 7577 +#line 7642 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7578 +#line 7643 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7580 +#line 7645 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7581 +#line 7646 .doubleBattle = FALSE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 7583 +#line 7648 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7585 +#line 7650 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7584 +#line 7649 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7586 +#line 7651 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, @@ -19046,17 +19046,17 @@ F_TRAINER_FEMALE | }, }, { -#line 7591 +#line 7656 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7593 +#line 7658 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7592 +#line 7657 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7594 +#line 7659 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, @@ -19064,17 +19064,17 @@ F_TRAINER_FEMALE | }, }, { -#line 7599 +#line 7664 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7601 +#line 7666 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7600 +#line 7665 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7602 +#line 7667 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, @@ -19083,272 +19083,115 @@ F_TRAINER_FEMALE | }, }, }, -#line 7607 +#line 7672 [TRAINER_LUNG] = { -#line 7608 +#line 7673 .trainerName = _("LUNG"), -#line 7609 +#line 7674 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7610 +#line 7675 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7612 +#line 7677 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7613 +#line 7678 .doubleBattle = FALSE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7615 +#line 7680 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7617 +#line 7682 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7616 +#line 7681 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7619 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7621 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7620 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7623 - [TRAINER_LAO_2] = - { -#line 7624 - .trainerName = _("LAO"), -#line 7625 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7626 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7628 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7629 - .doubleBattle = FALSE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7631 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7633 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7632 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7634 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7639 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7641 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7640 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7642 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7646 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7648 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7647 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7649 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7654 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7656 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7655 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7657 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7660 - [TRAINER_LAO_3] = - { -#line 7661 - .trainerName = _("LAO"), -#line 7662 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7663 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7665 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7666 - .doubleBattle = FALSE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7668 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7670 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7669 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7671 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7676 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7678 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7677 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7679 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { #line 7684 - .species = SPECIES_KOFFING, + .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, #line 7686 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 7685 - .lvl = 27, + .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7687 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7691 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7693 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7692 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7694 - MOVE_TACKLE, - MOVE_SLUDGE, - }, }, }, }, -#line 7697 - [TRAINER_LAO_4] = +#line 7688 + [TRAINER_LAO_2] = { -#line 7698 +#line 7689 .trainerName = _("LAO"), -#line 7699 +#line 7690 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7700 +#line 7691 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7702 +#line 7693 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7703 +#line 7694 .doubleBattle = FALSE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 7705 +#line 7696 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7707 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7706 - .lvl = 30, +#line 7698 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7697 + .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7708 +#line 7699 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, + }, + }, + { +#line 7704 + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7706 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7705 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7707 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, }, }, { -#line 7712 +#line 7711 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7714 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 7713 - .lvl = 30, + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 7712 + .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7715 +#line 7714 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, }, }, { @@ -19356,520 +19199,677 @@ F_TRAINER_FEMALE | .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, #line 7721 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 7720 - .lvl = 30, + .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { #line 7722 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7726 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7728 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7727 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7729 MOVE_TACKLE, MOVE_SLUDGE, }, }, }, }, -#line 7732 - [TRAINER_LAO_5] = +#line 7725 + [TRAINER_LAO_3] = { -#line 7733 +#line 7726 .trainerName = _("LAO"), -#line 7734 +#line 7727 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7735 +#line 7728 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7737 +#line 7730 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7738 +#line 7731 .doubleBattle = FALSE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 7740 +#line 7733 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7742 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7735 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 7734 + .lvl = 27, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7736 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, + }, + }, + { #line 7741 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, #line 7743 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 7742 + .lvl = 27, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7744 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, }, }, { -#line 7747 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, #line 7749 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7748 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7750 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7755 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7757 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7756 - .lvl = 33, +#line 7751 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 7750 + .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7758 +#line 7752 MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, }, }, { -#line 7763 - .species = SPECIES_WEEZING, +#line 7756 + .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7763 - .heldItem = ITEM_SMOKE_BALL, -#line 7765 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7764 - .lvl = 35, +#line 7758 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 7757 + .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7766 +#line 7759 MOVE_TACKLE, MOVE_SLUDGE, }, }, }, }, -#line 7769 - [TRAINER_JOCELYN] = +#line 7762 + [TRAINER_LAO_4] = { -#line 7770 - .trainerName = _("JOCELYN"), -#line 7771 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7772 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, +#line 7763 + .trainerName = _("LAO"), +#line 7764 + .trainerClass = TRAINER_CLASS_NINJA_BOY, +#line 7765 + .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 7773 -F_TRAINER_FEMALE | -#line 7774 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7775 +#line 7767 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 7768 .doubleBattle = FALSE, -#line 7776 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 7778 - .species = SPECIES_MEDITITE, +#line 7770 + .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7780 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7779 - .lvl = 13, +#line 7772 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 7771 + .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7773 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, }, - }, - }, -#line 7782 - [TRAINER_LAURA] = - { -#line 7783 - .trainerName = _("LAURA"), + }, + { +#line 7777 + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7779 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 7778 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7780 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + }, + }, + { #line 7784 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7785 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, #line 7786 -F_TRAINER_FEMALE | + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 7785 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { #line 7787 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7788 - .doubleBattle = FALSE, -#line 7789 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + }, + }, { #line 7791 - .species = SPECIES_MEDITITE, + .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, #line 7793 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 7792 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7794 + MOVE_TACKLE, + MOVE_SLUDGE, + }, + }, + }, + }, +#line 7797 + [TRAINER_LAO_5] = + { +#line 7798 + .trainerName = _("LAO"), +#line 7799 + .trainerClass = TRAINER_CLASS_NINJA_BOY, +#line 7800 + .trainerPic = TRAINER_PIC_NINJA_BOY, + .encounterMusic_gender = +#line 7802 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 7803 + .doubleBattle = FALSE, + .partySize = 4, + .party = (const struct TrainerMon[]) + { + { +#line 7805 + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7807 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7806 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7808 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + }, + }, + { +#line 7812 + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7814 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7813 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7815 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, + }, + }, + { +#line 7820 + .species = SPECIES_KOFFING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7822 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7821 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7823 + MOVE_POISON_GAS, + MOVE_TACKLE, + MOVE_SLUDGE, + MOVE_SELF_DESTRUCT, + }, + }, + { +#line 7828 + .species = SPECIES_WEEZING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7828 + .heldItem = ITEM_SMOKE_BALL, +#line 7830 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 7829 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 7831 + MOVE_TACKLE, + MOVE_SLUDGE, + }, + }, + }, + }, +#line 7834 + [TRAINER_JOCELYN] = + { +#line 7835 + .trainerName = _("JOCELYN"), +#line 7836 + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, +#line 7837 + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .encounterMusic_gender = +#line 7838 +F_TRAINER_FEMALE | +#line 7839 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7840 + .doubleBattle = FALSE, +#line 7841 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7843 + .species = SPECIES_MEDITITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7845 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 7844 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7795 +#line 7847 + [TRAINER_LAURA] = + { +#line 7848 + .trainerName = _("LAURA"), +#line 7849 + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, +#line 7850 + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .encounterMusic_gender = +#line 7851 +F_TRAINER_FEMALE | +#line 7852 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 7853 + .doubleBattle = FALSE, +#line 7854 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 7856 + .species = SPECIES_MEDITITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 7858 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 7857 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 7860 [TRAINER_CYNDY_1] = { -#line 7796 +#line 7861 .trainerName = _("CYNDY"), -#line 7797 +#line 7862 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7798 +#line 7863 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7799 +#line 7864 F_TRAINER_FEMALE | -#line 7800 +#line 7865 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7801 +#line 7866 .doubleBattle = FALSE, -#line 7802 +#line 7867 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7804 +#line 7869 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7806 +#line 7871 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7805 +#line 7870 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7808 +#line 7873 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7810 +#line 7875 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7809 +#line 7874 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7812 +#line 7877 [TRAINER_CORA] = { -#line 7813 +#line 7878 .trainerName = _("CORA"), -#line 7814 +#line 7879 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7815 +#line 7880 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7816 +#line 7881 F_TRAINER_FEMALE | -#line 7817 +#line 7882 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7818 +#line 7883 .doubleBattle = FALSE, -#line 7819 +#line 7884 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7821 +#line 7886 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7823 +#line 7888 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7822 +#line 7887 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7825 +#line 7890 [TRAINER_PAULA] = { -#line 7826 +#line 7891 .trainerName = _("PAULA"), -#line 7827 +#line 7892 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7828 +#line 7893 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7829 +#line 7894 F_TRAINER_FEMALE | -#line 7830 +#line 7895 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7831 +#line 7896 .doubleBattle = FALSE, -#line 7832 +#line 7897 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7834 +#line 7899 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7836 +#line 7901 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7835 +#line 7900 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7838 +#line 7903 [TRAINER_CYNDY_2] = { -#line 7839 +#line 7904 .trainerName = _("CYNDY"), -#line 7840 +#line 7905 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7841 +#line 7906 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7842 +#line 7907 F_TRAINER_FEMALE | -#line 7843 +#line 7908 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7844 +#line 7909 .doubleBattle = FALSE, -#line 7845 +#line 7910 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7847 +#line 7912 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7849 +#line 7914 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7848 +#line 7913 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7851 +#line 7916 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7853 +#line 7918 .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7852 +#line 7917 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7855 +#line 7920 [TRAINER_CYNDY_3] = { -#line 7856 +#line 7921 .trainerName = _("CYNDY"), -#line 7857 +#line 7922 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7858 +#line 7923 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7859 +#line 7924 F_TRAINER_FEMALE | -#line 7860 +#line 7925 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7861 +#line 7926 .doubleBattle = FALSE, -#line 7862 +#line 7927 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7864 +#line 7929 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7866 +#line 7931 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7865 +#line 7930 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7868 +#line 7933 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7870 +#line 7935 .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7869 +#line 7934 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7872 +#line 7937 [TRAINER_CYNDY_4] = { -#line 7873 +#line 7938 .trainerName = _("CYNDY"), -#line 7874 +#line 7939 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7875 +#line 7940 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7876 +#line 7941 F_TRAINER_FEMALE | -#line 7877 +#line 7942 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7878 +#line 7943 .doubleBattle = FALSE, -#line 7879 +#line 7944 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7881 +#line 7946 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7883 +#line 7948 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7882 +#line 7947 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7885 +#line 7950 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7887 +#line 7952 .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7886 +#line 7951 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7889 +#line 7954 [TRAINER_CYNDY_5] = { -#line 7890 +#line 7955 .trainerName = _("CYNDY"), -#line 7891 +#line 7956 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7892 +#line 7957 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 7893 +#line 7958 F_TRAINER_FEMALE | -#line 7894 +#line 7959 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7895 +#line 7960 .doubleBattle = FALSE, -#line 7896 +#line 7961 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7898 +#line 7963 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7900 +#line 7965 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7899 +#line 7964 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7902 +#line 7967 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7904 +#line 7969 .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7903 +#line 7968 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7906 +#line 7971 [TRAINER_MADELINE_1] = { -#line 7907 +#line 7972 .trainerName = _("MADELINE"), -#line 7908 +#line 7973 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7909 +#line 7974 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7910 +#line 7975 F_TRAINER_FEMALE | -#line 7911 +#line 7976 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7912 +#line 7977 .doubleBattle = FALSE, -#line 7913 +#line 7978 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7915 +#line 7980 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7917 +#line 7982 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7916 +#line 7981 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7918 +#line 7983 MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, @@ -19878,84 +19878,84 @@ F_TRAINER_FEMALE | }, }, }, -#line 7923 +#line 7988 [TRAINER_CLARISSA] = { -#line 7924 +#line 7989 .trainerName = _("CLARISSA"), -#line 7925 +#line 7990 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7926 +#line 7991 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7927 +#line 7992 F_TRAINER_FEMALE | -#line 7928 +#line 7993 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7929 +#line 7994 .doubleBattle = FALSE, -#line 7930 +#line 7995 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 7932 +#line 7997 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7934 +#line 7999 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7933 +#line 7998 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 7936 +#line 8001 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7938 +#line 8003 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7937 +#line 8002 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 7940 +#line 8005 [TRAINER_ANGELICA] = { -#line 7941 +#line 8006 .trainerName = _("ANGELICA"), -#line 7942 +#line 8007 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7943 +#line 8008 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7944 +#line 8009 F_TRAINER_FEMALE | -#line 7945 +#line 8010 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7946 +#line 8011 .doubleBattle = FALSE, -#line 7947 +#line 8012 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7949 +#line 8014 .species = SPECIES_CASTFORM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7951 +#line 8016 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 7950 +#line 8015 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7952 +#line 8017 MOVE_RAIN_DANCE, MOVE_WEATHER_BALL, MOVE_THUNDER, @@ -19964,39 +19964,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 7957 +#line 8022 [TRAINER_MADELINE_2] = { -#line 7958 +#line 8023 .trainerName = _("MADELINE"), -#line 7959 +#line 8024 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7960 +#line 8025 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7961 +#line 8026 F_TRAINER_FEMALE | -#line 7962 +#line 8027 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7963 +#line 8028 .doubleBattle = FALSE, -#line 7964 +#line 8029 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7966 +#line 8031 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7968 +#line 8033 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7967 +#line 8032 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7969 +#line 8034 MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, @@ -20005,39 +20005,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 7974 +#line 8039 [TRAINER_MADELINE_3] = { -#line 7975 +#line 8040 .trainerName = _("MADELINE"), -#line 7976 +#line 8041 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7977 +#line 8042 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7978 +#line 8043 F_TRAINER_FEMALE | -#line 7979 +#line 8044 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7980 +#line 8045 .doubleBattle = FALSE, -#line 7981 +#line 8046 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 7983 +#line 8048 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 7985 +#line 8050 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7984 +#line 8049 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 7986 +#line 8051 MOVE_EMBER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, @@ -20046,39 +20046,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 7991 +#line 8056 [TRAINER_MADELINE_4] = { -#line 7992 +#line 8057 .trainerName = _("MADELINE"), -#line 7993 +#line 8058 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7994 +#line 8059 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 7995 +#line 8060 F_TRAINER_FEMALE | -#line 7996 +#line 8061 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7997 +#line 8062 .doubleBattle = FALSE, -#line 7998 +#line 8063 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8000 +#line 8065 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8002 +#line 8067 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8001 +#line 8066 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8003 +#line 8068 MOVE_LEECH_SEED, MOVE_MEGA_DRAIN, MOVE_GRASS_WHISTLE, @@ -20086,17 +20086,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8008 +#line 8073 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8010 +#line 8075 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8009 +#line 8074 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8011 +#line 8076 MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, @@ -20105,39 +20105,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 8016 +#line 8081 [TRAINER_MADELINE_5] = { -#line 8017 +#line 8082 .trainerName = _("MADELINE"), -#line 8018 +#line 8083 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8019 +#line 8084 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 8020 +#line 8085 F_TRAINER_FEMALE | -#line 8021 +#line 8086 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8022 +#line 8087 .doubleBattle = FALSE, -#line 8023 +#line 8088 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8025 +#line 8090 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8027 +#line 8092 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8026 +#line 8091 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8028 +#line 8093 MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_SOLAR_BEAM, @@ -20145,17 +20145,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8033 +#line 8098 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8035 +#line 8100 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8034 +#line 8099 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8036 +#line 8101 MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, @@ -20164,1145 +20164,1145 @@ F_TRAINER_FEMALE | }, }, }, -#line 8041 +#line 8106 [TRAINER_BEVERLY] = { -#line 8042 +#line 8107 .trainerName = _("BEVERLY"), -#line 8043 +#line 8108 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8044 +#line 8109 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8045 +#line 8110 F_TRAINER_FEMALE | -#line 8046 +#line 8111 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8047 +#line 8112 .doubleBattle = FALSE, -#line 8048 +#line 8113 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8050 +#line 8115 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8052 +#line 8117 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8051 +#line 8116 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8054 +#line 8119 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8056 +#line 8121 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8055 +#line 8120 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8058 +#line 8123 [TRAINER_IMANI] = { -#line 8059 +#line 8124 .trainerName = _("IMANI"), -#line 8060 +#line 8125 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8061 +#line 8126 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8062 +#line 8127 F_TRAINER_FEMALE | -#line 8063 +#line 8128 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8064 +#line 8129 .doubleBattle = FALSE, -#line 8065 +#line 8130 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8067 +#line 8132 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8069 +#line 8134 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8068 +#line 8133 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8071 +#line 8136 [TRAINER_KYLA] = { -#line 8072 +#line 8137 .trainerName = _("KYLA"), -#line 8073 +#line 8138 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8074 +#line 8139 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8075 +#line 8140 F_TRAINER_FEMALE | -#line 8076 +#line 8141 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8077 +#line 8142 .doubleBattle = FALSE, -#line 8078 +#line 8143 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8080 +#line 8145 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8082 +#line 8147 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8081 +#line 8146 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8084 +#line 8149 [TRAINER_DENISE] = { -#line 8085 +#line 8150 .trainerName = _("DENISE"), -#line 8086 +#line 8151 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8087 +#line 8152 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8088 +#line 8153 F_TRAINER_FEMALE | -#line 8089 +#line 8154 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8090 +#line 8155 .doubleBattle = FALSE, -#line 8091 +#line 8156 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8093 +#line 8158 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8095 +#line 8160 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8094 +#line 8159 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8097 +#line 8162 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8099 +#line 8164 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8098 +#line 8163 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8101 +#line 8166 [TRAINER_BETH] = { -#line 8102 +#line 8167 .trainerName = _("BETH"), -#line 8103 +#line 8168 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8104 +#line 8169 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8105 +#line 8170 F_TRAINER_FEMALE | -#line 8106 +#line 8171 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8107 +#line 8172 .doubleBattle = FALSE, -#line 8108 +#line 8173 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8110 +#line 8175 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8112 +#line 8177 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8111 +#line 8176 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8114 +#line 8179 [TRAINER_TARA] = { -#line 8115 +#line 8180 .trainerName = _("TARA"), -#line 8116 +#line 8181 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8117 +#line 8182 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8118 +#line 8183 F_TRAINER_FEMALE | -#line 8119 +#line 8184 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8120 +#line 8185 .doubleBattle = FALSE, -#line 8121 +#line 8186 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8123 +#line 8188 .species = SPECIES_HORSEA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8125 +#line 8190 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8124 +#line 8189 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8127 +#line 8192 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8129 +#line 8194 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8128 +#line 8193 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8131 +#line 8196 [TRAINER_MISSY] = { -#line 8132 +#line 8197 .trainerName = _("MISSY"), -#line 8133 +#line 8198 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8134 +#line 8199 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8135 +#line 8200 F_TRAINER_FEMALE | -#line 8136 +#line 8201 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8137 +#line 8202 .doubleBattle = FALSE, -#line 8138 +#line 8203 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8140 +#line 8205 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8142 +#line 8207 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8141 +#line 8206 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8144 +#line 8209 [TRAINER_ALICE] = { -#line 8145 +#line 8210 .trainerName = _("ALICE"), -#line 8146 +#line 8211 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8147 +#line 8212 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8148 +#line 8213 F_TRAINER_FEMALE | -#line 8149 +#line 8214 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8150 +#line 8215 .doubleBattle = FALSE, -#line 8151 +#line 8216 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8153 +#line 8218 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8155 +#line 8220 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8154 +#line 8219 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8157 +#line 8222 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8159 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8158 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8161 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8163 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8162 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8165 - [TRAINER_JENNY_1] = - { -#line 8166 - .trainerName = _("JENNY"), -#line 8167 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8168 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8169 -F_TRAINER_FEMALE | -#line 8170 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8171 - .doubleBattle = FALSE, -#line 8172 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8174 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8176 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8175 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8178 - [TRAINER_GRACE] = - { -#line 8179 - .trainerName = _("GRACE"), -#line 8180 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8181 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8182 -F_TRAINER_FEMALE | -#line 8183 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8184 - .doubleBattle = FALSE, -#line 8185 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8187 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8189 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8188 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8191 - [TRAINER_TANYA] = - { -#line 8192 - .trainerName = _("TANYA"), -#line 8193 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8194 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8195 -F_TRAINER_FEMALE | -#line 8196 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8197 - .doubleBattle = FALSE, -#line 8198 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8200 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8202 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8201 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8204 - [TRAINER_SHARON] = - { -#line 8205 - .trainerName = _("SHARON"), -#line 8206 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8207 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8208 -F_TRAINER_FEMALE | -#line 8209 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8210 - .doubleBattle = FALSE, -#line 8211 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8213 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8215 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8214 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8217 - [TRAINER_NIKKI] = - { -#line 8218 - .trainerName = _("NIKKI"), -#line 8219 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8220 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8221 -F_TRAINER_FEMALE | -#line 8222 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8223 - .doubleBattle = FALSE, #line 8224 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8223 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 8226 - .species = SPECIES_MARILL, + .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, #line 8228 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 8227 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 8230 + [TRAINER_JENNY_1] = + { +#line 8231 + .trainerName = _("JENNY"), +#line 8232 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 8233 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 8234 +F_TRAINER_FEMALE | +#line 8235 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 8236 + .doubleBattle = FALSE, +#line 8237 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 8239 + .species = SPECIES_WAILMER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 8241 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8240 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 8243 + [TRAINER_GRACE] = + { +#line 8244 + .trainerName = _("GRACE"), +#line 8245 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 8246 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 8247 +F_TRAINER_FEMALE | +#line 8248 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 8249 + .doubleBattle = FALSE, +#line 8250 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 8252 + .species = SPECIES_MARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 8254 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8253 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 8256 + [TRAINER_TANYA] = + { +#line 8257 + .trainerName = _("TANYA"), +#line 8258 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 8259 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 8260 +F_TRAINER_FEMALE | +#line 8261 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 8262 + .doubleBattle = FALSE, +#line 8263 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 8265 + .species = SPECIES_LUVDISC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 8267 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8266 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 8269 + [TRAINER_SHARON] = + { +#line 8270 + .trainerName = _("SHARON"), +#line 8271 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 8272 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 8273 +F_TRAINER_FEMALE | +#line 8274 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 8275 + .doubleBattle = FALSE, +#line 8276 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 8278 + .species = SPECIES_SEAKING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 8280 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8279 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 8282 + [TRAINER_NIKKI] = + { +#line 8283 + .trainerName = _("NIKKI"), +#line 8284 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 8285 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 8286 +F_TRAINER_FEMALE | +#line 8287 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 8288 + .doubleBattle = FALSE, +#line 8289 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 8291 + .species = SPECIES_MARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 8293 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 8292 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8230 +#line 8295 .species = SPECIES_SPHEAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8232 +#line 8297 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8231 +#line 8296 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8234 +#line 8299 [TRAINER_BRENDA] = { -#line 8235 +#line 8300 .trainerName = _("BRENDA"), -#line 8236 +#line 8301 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8237 +#line 8302 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8238 +#line 8303 F_TRAINER_FEMALE | -#line 8239 +#line 8304 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8240 +#line 8305 .doubleBattle = FALSE, -#line 8241 +#line 8306 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8243 +#line 8308 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8245 +#line 8310 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8244 +#line 8309 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8247 +#line 8312 [TRAINER_KATIE] = { -#line 8248 +#line 8313 .trainerName = _("KATIE"), -#line 8249 +#line 8314 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8250 +#line 8315 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8251 +#line 8316 F_TRAINER_FEMALE | -#line 8252 +#line 8317 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8253 +#line 8318 .doubleBattle = FALSE, -#line 8254 +#line 8319 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8256 +#line 8321 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8258 +#line 8323 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8257 +#line 8322 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8260 +#line 8325 .species = SPECIES_SPHEAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8262 +#line 8327 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8261 +#line 8326 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8264 +#line 8329 [TRAINER_SUSIE] = { -#line 8265 +#line 8330 .trainerName = _("SUSIE"), -#line 8266 +#line 8331 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8267 +#line 8332 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8268 +#line 8333 F_TRAINER_FEMALE | -#line 8269 +#line 8334 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8270 +#line 8335 .doubleBattle = FALSE, -#line 8271 +#line 8336 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8273 +#line 8338 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8275 +#line 8340 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8274 +#line 8339 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8277 +#line 8342 [TRAINER_KARA] = { -#line 8278 +#line 8343 .trainerName = _("KARA"), -#line 8279 +#line 8344 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8280 +#line 8345 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8281 +#line 8346 F_TRAINER_FEMALE | -#line 8282 +#line 8347 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8283 +#line 8348 .doubleBattle = FALSE, -#line 8284 +#line 8349 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8286 +#line 8351 .species = SPECIES_SEAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8288 +#line 8353 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8287 +#line 8352 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8290 +#line 8355 [TRAINER_DANA] = { -#line 8291 +#line 8356 .trainerName = _("DANA"), -#line 8292 +#line 8357 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8293 +#line 8358 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8294 +#line 8359 F_TRAINER_FEMALE | -#line 8295 +#line 8360 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8296 +#line 8361 .doubleBattle = FALSE, -#line 8297 +#line 8362 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8299 +#line 8364 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8301 +#line 8366 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8300 +#line 8365 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8303 +#line 8368 [TRAINER_SIENNA] = { -#line 8304 +#line 8369 .trainerName = _("SIENNA"), -#line 8305 +#line 8370 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8306 +#line 8371 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8307 +#line 8372 F_TRAINER_FEMALE | -#line 8308 +#line 8373 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8309 +#line 8374 .doubleBattle = FALSE, -#line 8310 +#line 8375 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8312 +#line 8377 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8314 +#line 8379 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8313 +#line 8378 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8316 +#line 8381 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8318 +#line 8383 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8317 +#line 8382 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8320 +#line 8385 [TRAINER_DEBRA] = { -#line 8321 +#line 8386 .trainerName = _("DEBRA"), -#line 8322 +#line 8387 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8323 +#line 8388 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8324 +#line 8389 F_TRAINER_FEMALE | -#line 8325 +#line 8390 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8326 +#line 8391 .doubleBattle = FALSE, -#line 8327 +#line 8392 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8329 +#line 8394 .species = SPECIES_SEAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8331 +#line 8396 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8330 +#line 8395 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8333 +#line 8398 [TRAINER_LINDA] = { -#line 8334 +#line 8399 .trainerName = _("LINDA"), -#line 8335 +#line 8400 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8336 +#line 8401 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8337 +#line 8402 F_TRAINER_FEMALE | -#line 8338 +#line 8403 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8339 +#line 8404 .doubleBattle = FALSE, -#line 8340 +#line 8405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8342 +#line 8407 .species = SPECIES_HORSEA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8344 +#line 8409 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8343 +#line 8408 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8346 +#line 8411 .species = SPECIES_SEADRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8348 +#line 8413 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8347 +#line 8412 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8350 +#line 8415 [TRAINER_KAYLEE] = { -#line 8351 +#line 8416 .trainerName = _("KAYLEE"), -#line 8352 +#line 8417 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8353 +#line 8418 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8354 +#line 8419 F_TRAINER_FEMALE | -#line 8355 +#line 8420 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8356 +#line 8421 .doubleBattle = FALSE, -#line 8357 +#line 8422 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8359 +#line 8424 .species = SPECIES_LANTURN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8361 +#line 8426 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8360 +#line 8425 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8363 +#line 8428 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8365 +#line 8430 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8364 +#line 8429 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8367 +#line 8432 [TRAINER_LAUREL] = { -#line 8368 +#line 8433 .trainerName = _("LAUREL"), -#line 8369 +#line 8434 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8370 +#line 8435 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8371 +#line 8436 F_TRAINER_FEMALE | -#line 8372 +#line 8437 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8373 +#line 8438 .doubleBattle = FALSE, -#line 8374 +#line 8439 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8376 +#line 8441 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8378 +#line 8443 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8377 +#line 8442 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8380 +#line 8445 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8382 +#line 8447 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8381 +#line 8446 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8384 +#line 8449 [TRAINER_CARLEE] = { -#line 8385 +#line 8450 .trainerName = _("CARLEE"), -#line 8386 +#line 8451 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8387 +#line 8452 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8388 +#line 8453 F_TRAINER_FEMALE | -#line 8389 +#line 8454 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8390 +#line 8455 .doubleBattle = FALSE, -#line 8391 +#line 8456 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8393 +#line 8458 .species = SPECIES_SEAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8395 +#line 8460 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8394 +#line 8459 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8397 +#line 8462 [TRAINER_JENNY_2] = { -#line 8398 +#line 8463 .trainerName = _("JENNY"), -#line 8399 +#line 8464 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8400 +#line 8465 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8401 +#line 8466 F_TRAINER_FEMALE | -#line 8402 +#line 8467 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8403 +#line 8468 .doubleBattle = FALSE, -#line 8404 +#line 8469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8406 +#line 8471 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8408 +#line 8473 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8407 +#line 8472 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8410 +#line 8475 [TRAINER_JENNY_3] = { -#line 8411 +#line 8476 .trainerName = _("JENNY"), -#line 8412 +#line 8477 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8413 +#line 8478 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8414 +#line 8479 F_TRAINER_FEMALE | -#line 8415 +#line 8480 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8416 +#line 8481 .doubleBattle = FALSE, -#line 8417 +#line 8482 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8419 +#line 8484 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8421 +#line 8486 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8420 +#line 8485 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8423 +#line 8488 [TRAINER_JENNY_4] = { -#line 8424 +#line 8489 .trainerName = _("JENNY"), -#line 8425 +#line 8490 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8426 +#line 8491 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8427 +#line 8492 F_TRAINER_FEMALE | -#line 8428 +#line 8493 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8429 +#line 8494 .doubleBattle = FALSE, -#line 8430 +#line 8495 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8432 +#line 8497 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8434 +#line 8499 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8433 +#line 8498 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8436 +#line 8501 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8438 +#line 8503 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8437 +#line 8502 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8440 +#line 8505 [TRAINER_JENNY_5] = { -#line 8441 +#line 8506 .trainerName = _("JENNY"), -#line 8442 +#line 8507 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8443 +#line 8508 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 8444 +#line 8509 F_TRAINER_FEMALE | -#line 8445 +#line 8510 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8446 +#line 8511 .doubleBattle = FALSE, -#line 8447 +#line 8512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8449 +#line 8514 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8451 +#line 8516 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8450 +#line 8515 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8453 +#line 8518 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8455 +#line 8520 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8454 +#line 8519 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8457 +#line 8522 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8459 +#line 8524 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8458 +#line 8523 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8461 +#line 8526 [TRAINER_HEIDI] = { -#line 8462 +#line 8527 .trainerName = _("HEIDI"), -#line 8463 +#line 8528 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8464 +#line 8529 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8465 +#line 8530 F_TRAINER_FEMALE | -#line 8466 +#line 8531 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8467 +#line 8532 .doubleBattle = FALSE, -#line 8468 +#line 8533 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8470 +#line 8535 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8472 +#line 8537 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8471 +#line 8536 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8473 +#line 8538 MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, @@ -21310,17 +21310,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8478 +#line 8543 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8480 +#line 8545 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8479 +#line 8544 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8481 +#line 8546 MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, @@ -21329,39 +21329,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 8486 +#line 8551 [TRAINER_BECKY] = { -#line 8487 +#line 8552 .trainerName = _("BECKY"), -#line 8488 +#line 8553 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8489 +#line 8554 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8490 +#line 8555 F_TRAINER_FEMALE | -#line 8491 +#line 8556 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8492 +#line 8557 .doubleBattle = FALSE, -#line 8493 +#line 8558 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8495 +#line 8560 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8497 +#line 8562 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8496 +#line 8561 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8498 +#line 8563 MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH, @@ -21369,17 +21369,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8503 +#line 8568 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8505 +#line 8570 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8504 +#line 8569 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8506 +#line 8571 MOVE_ROLLOUT, MOVE_BUBBLE_BEAM, MOVE_TAIL_WHIP, @@ -21388,228 +21388,228 @@ F_TRAINER_FEMALE | }, }, }, -#line 8511 +#line 8576 [TRAINER_CAROL] = { -#line 8512 +#line 8577 .trainerName = _("CAROL"), -#line 8513 +#line 8578 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8514 +#line 8579 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8515 +#line 8580 F_TRAINER_FEMALE | -#line 8516 +#line 8581 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8517 +#line 8582 .doubleBattle = FALSE, -#line 8518 +#line 8583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8520 +#line 8585 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8522 +#line 8587 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8521 +#line 8586 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8524 +#line 8589 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8526 +#line 8591 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8525 +#line 8590 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8528 +#line 8593 [TRAINER_NANCY] = { -#line 8529 +#line 8594 .trainerName = _("NANCY"), -#line 8530 +#line 8595 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8531 +#line 8596 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8532 +#line 8597 F_TRAINER_FEMALE | -#line 8533 +#line 8598 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8534 +#line 8599 .doubleBattle = FALSE, -#line 8535 +#line 8600 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8537 +#line 8602 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8539 +#line 8604 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8538 +#line 8603 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8541 +#line 8606 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8543 +#line 8608 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8542 +#line 8607 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8545 +#line 8610 [TRAINER_MARTHA] = { -#line 8546 +#line 8611 .trainerName = _("MARTHA"), -#line 8547 +#line 8612 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8548 +#line 8613 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8549 +#line 8614 F_TRAINER_FEMALE | -#line 8550 +#line 8615 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8551 +#line 8616 .doubleBattle = FALSE, -#line 8552 +#line 8617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8554 +#line 8619 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8556 +#line 8621 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8555 +#line 8620 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8558 +#line 8623 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8560 +#line 8625 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8559 +#line 8624 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8562 +#line 8627 [TRAINER_DIANA_1] = { -#line 8563 +#line 8628 .trainerName = _("DIANA"), -#line 8564 +#line 8629 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8565 +#line 8630 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8566 +#line 8631 F_TRAINER_FEMALE | -#line 8567 +#line 8632 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8568 +#line 8633 .doubleBattle = FALSE, -#line 8569 +#line 8634 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8571 +#line 8636 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8573 +#line 8638 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8572 +#line 8637 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8575 +#line 8640 .species = SPECIES_ODDISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8577 +#line 8642 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8576 +#line 8641 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8579 +#line 8644 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8581 +#line 8646 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8580 +#line 8645 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8583 +#line 8648 [TRAINER_CEDRIC] = { -#line 8584 +#line 8649 .trainerName = _("CEDRIC"), -#line 8585 +#line 8650 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 8586 +#line 8651 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 8588 +#line 8653 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 8589 +#line 8654 .doubleBattle = FALSE, -#line 8590 +#line 8655 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8592 +#line 8657 .species = SPECIES_WOBBUFFET, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8594 +#line 8659 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8593 +#line 8658 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8595 +#line 8660 MOVE_DESTINY_BOND, MOVE_SAFEGUARD, MOVE_COUNTER, @@ -21618,617 +21618,617 @@ F_TRAINER_FEMALE | }, }, }, -#line 8600 +#line 8665 [TRAINER_IRENE] = { -#line 8601 +#line 8666 .trainerName = _("IRENE"), -#line 8602 +#line 8667 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8603 +#line 8668 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8604 +#line 8669 F_TRAINER_FEMALE | -#line 8605 +#line 8670 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8606 +#line 8671 .doubleBattle = FALSE, -#line 8607 +#line 8672 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8609 +#line 8674 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8611 +#line 8676 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8610 +#line 8675 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8613 +#line 8678 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8615 +#line 8680 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8614 +#line 8679 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8617 +#line 8682 [TRAINER_DIANA_2] = { -#line 8618 +#line 8683 .trainerName = _("DIANA"), -#line 8619 +#line 8684 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8620 +#line 8685 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8621 +#line 8686 F_TRAINER_FEMALE | -#line 8622 +#line 8687 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8623 +#line 8688 .doubleBattle = FALSE, -#line 8624 +#line 8689 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8626 +#line 8691 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8628 +#line 8693 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8627 +#line 8692 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8630 +#line 8695 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8632 +#line 8697 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8631 +#line 8696 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8634 +#line 8699 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8636 +#line 8701 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8635 +#line 8700 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8638 +#line 8703 [TRAINER_DIANA_3] = { -#line 8639 +#line 8704 .trainerName = _("DIANA"), -#line 8640 +#line 8705 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8641 +#line 8706 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8642 +#line 8707 F_TRAINER_FEMALE | -#line 8643 +#line 8708 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8644 +#line 8709 .doubleBattle = FALSE, -#line 8645 +#line 8710 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8647 +#line 8712 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8649 +#line 8714 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8648 +#line 8713 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8651 +#line 8716 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8653 +#line 8718 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8652 +#line 8717 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8655 +#line 8720 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8657 +#line 8722 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8656 +#line 8721 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8659 +#line 8724 [TRAINER_DIANA_4] = { -#line 8660 +#line 8725 .trainerName = _("DIANA"), -#line 8661 +#line 8726 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8662 +#line 8727 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8663 +#line 8728 F_TRAINER_FEMALE | -#line 8664 +#line 8729 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8665 +#line 8730 .doubleBattle = FALSE, -#line 8666 +#line 8731 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8668 +#line 8733 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8670 +#line 8735 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8669 +#line 8734 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8672 +#line 8737 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8674 +#line 8739 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8673 +#line 8738 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8676 +#line 8741 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8678 +#line 8743 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8677 +#line 8742 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8680 +#line 8745 [TRAINER_DIANA_5] = { -#line 8681 +#line 8746 .trainerName = _("DIANA"), -#line 8682 +#line 8747 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8683 +#line 8748 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 8684 +#line 8749 F_TRAINER_FEMALE | -#line 8685 +#line 8750 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8686 +#line 8751 .doubleBattle = FALSE, -#line 8687 +#line 8752 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8689 +#line 8754 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8691 +#line 8756 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8690 +#line 8755 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8693 +#line 8758 .species = SPECIES_VILEPLUME, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8695 +#line 8760 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8694 +#line 8759 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8697 +#line 8762 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8699 +#line 8764 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8698 +#line 8763 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8701 +#line 8766 [TRAINER_AMY_AND_LIV_1] = { -#line 8702 +#line 8767 .trainerName = _("AMY & LIV"), -#line 8703 +#line 8768 .trainerClass = TRAINER_CLASS_TWINS, -#line 8704 +#line 8769 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8706 +#line 8771 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8707 +#line 8772 .doubleBattle = TRUE, -#line 8708 +#line 8773 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8710 +#line 8775 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8712 +#line 8777 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8711 +#line 8776 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8714 +#line 8779 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8716 +#line 8781 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8715 +#line 8780 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8718 +#line 8783 [TRAINER_AMY_AND_LIV_2] = { -#line 8719 +#line 8784 .trainerName = _("AMY & LIV"), -#line 8720 +#line 8785 .trainerClass = TRAINER_CLASS_TWINS, -#line 8721 +#line 8786 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8723 +#line 8788 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8724 +#line 8789 .doubleBattle = TRUE, -#line 8725 +#line 8790 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8727 +#line 8792 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8729 +#line 8794 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8728 +#line 8793 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8731 +#line 8796 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8733 +#line 8798 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8732 +#line 8797 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8735 +#line 8800 [TRAINER_GINA_AND_MIA_1] = { -#line 8736 +#line 8801 .trainerName = _("GINA & MIA"), -#line 8737 +#line 8802 .trainerClass = TRAINER_CLASS_TWINS, -#line 8738 +#line 8803 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8740 +#line 8805 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8741 +#line 8806 .doubleBattle = TRUE, -#line 8742 +#line 8807 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8744 +#line 8809 .species = SPECIES_SEEDOT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8746 +#line 8811 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8745 +#line 8810 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8748 +#line 8813 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8750 +#line 8815 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8749 +#line 8814 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8752 +#line 8817 [TRAINER_MIU_AND_YUKI] = { -#line 8753 +#line 8818 .trainerName = _("MIU & YUKI"), -#line 8754 +#line 8819 .trainerClass = TRAINER_CLASS_TWINS, -#line 8755 +#line 8820 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8757 +#line 8822 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8758 +#line 8823 .doubleBattle = TRUE, -#line 8759 +#line 8824 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8761 +#line 8826 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8763 +#line 8828 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8762 +#line 8827 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8765 +#line 8830 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8767 +#line 8832 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8766 +#line 8831 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8769 +#line 8834 [TRAINER_AMY_AND_LIV_3] = { -#line 8770 +#line 8835 .trainerName = _("AMY & LIV"), -#line 8771 +#line 8836 .trainerClass = TRAINER_CLASS_TWINS, -#line 8772 +#line 8837 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8774 +#line 8839 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8775 +#line 8840 .doubleBattle = TRUE, -#line 8776 +#line 8841 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8778 +#line 8843 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8780 +#line 8845 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8779 +#line 8844 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8782 +#line 8847 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8784 +#line 8849 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8783 +#line 8848 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8786 +#line 8851 [TRAINER_GINA_AND_MIA_2] = { -#line 8787 +#line 8852 .trainerName = _("GINA & MIA"), -#line 8788 +#line 8853 .trainerClass = TRAINER_CLASS_TWINS, -#line 8789 +#line 8854 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8791 +#line 8856 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8792 +#line 8857 .doubleBattle = TRUE, -#line 8793 +#line 8858 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8795 +#line 8860 .species = SPECIES_DUSKULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8797 +#line 8862 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8796 +#line 8861 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8798 +#line 8863 MOVE_NIGHT_SHADE, MOVE_DISABLE, }, }, { -#line 8801 +#line 8866 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8803 +#line 8868 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8802 +#line 8867 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8804 +#line 8869 MOVE_ABSORB, MOVE_LEECH_SEED, }, }, }, }, -#line 8807 +#line 8872 [TRAINER_AMY_AND_LIV_4] = { -#line 8808 +#line 8873 .trainerName = _("AMY & LIV"), -#line 8809 +#line 8874 .trainerClass = TRAINER_CLASS_TWINS, -#line 8810 +#line 8875 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8812 +#line 8877 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8813 +#line 8878 .doubleBattle = TRUE, -#line 8814 +#line 8879 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8816 +#line 8881 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8818 +#line 8883 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8817 +#line 8882 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8820 +#line 8885 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8822 +#line 8887 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8821 +#line 8886 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8824 +#line 8889 [TRAINER_AMY_AND_LIV_5] = { -#line 8825 +#line 8890 .trainerName = _("AMY & LIV"), -#line 8826 +#line 8891 .trainerClass = TRAINER_CLASS_TWINS, -#line 8827 +#line 8892 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8829 +#line 8894 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8830 +#line 8895 .doubleBattle = TRUE, -#line 8831 +#line 8896 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8833 +#line 8898 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8835 +#line 8900 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8834 +#line 8899 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8836 +#line 8901 MOVE_SPARK, MOVE_CHARGE, MOVE_FAKE_TEARS, @@ -22236,17 +22236,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8841 +#line 8906 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8843 +#line 8908 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8842 +#line 8907 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8844 +#line 8909 MOVE_SPARK, MOVE_CHARGE, MOVE_CHARM, @@ -22255,37 +22255,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 8849 +#line 8914 [TRAINER_AMY_AND_LIV_6] = { -#line 8850 +#line 8915 .trainerName = _("AMY & LIV"), -#line 8851 +#line 8916 .trainerClass = TRAINER_CLASS_TWINS, -#line 8852 +#line 8917 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 8854 +#line 8919 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8855 +#line 8920 .doubleBattle = TRUE, -#line 8856 +#line 8921 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8858 +#line 8923 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8860 +#line 8925 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8859 +#line 8924 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8861 +#line 8926 MOVE_THUNDER, MOVE_CHARGE, MOVE_FAKE_TEARS, @@ -22293,17 +22293,17 @@ F_TRAINER_FEMALE | }, }, { -#line 8866 +#line 8931 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8868 +#line 8933 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8867 +#line 8932 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 8869 +#line 8934 MOVE_THUNDER, MOVE_CHARGE, MOVE_CHARM, @@ -22312,601 +22312,601 @@ F_TRAINER_FEMALE | }, }, }, -#line 8874 +#line 8939 [TRAINER_HUEY] = { -#line 8875 +#line 8940 .trainerName = _("HUEY"), -#line 8876 +#line 8941 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8877 +#line 8942 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8879 +#line 8944 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8880 +#line 8945 .doubleBattle = FALSE, -#line 8881 +#line 8946 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8883 +#line 8948 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8885 +#line 8950 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8884 +#line 8949 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8887 +#line 8952 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8889 +#line 8954 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8888 +#line 8953 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8891 +#line 8956 [TRAINER_EDMOND] = { -#line 8892 +#line 8957 .trainerName = _("EDMOND"), -#line 8893 +#line 8958 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8894 +#line 8959 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8896 +#line 8961 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8897 +#line 8962 .doubleBattle = FALSE, -#line 8898 +#line 8963 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 8900 +#line 8965 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8902 +#line 8967 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8901 +#line 8966 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8904 +#line 8969 [TRAINER_ERNEST_1] = { -#line 8905 +#line 8970 .trainerName = _("ERNEST"), -#line 8906 +#line 8971 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8907 +#line 8972 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8909 +#line 8974 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8910 +#line 8975 .doubleBattle = FALSE, -#line 8911 +#line 8976 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8913 +#line 8978 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8915 +#line 8980 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8914 +#line 8979 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8917 +#line 8982 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8919 +#line 8984 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8918 +#line 8983 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8921 +#line 8986 [TRAINER_DWAYNE] = { -#line 8922 +#line 8987 .trainerName = _("DWAYNE"), -#line 8923 +#line 8988 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8924 +#line 8989 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8926 +#line 8991 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8927 +#line 8992 .doubleBattle = FALSE, -#line 8928 +#line 8993 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8930 +#line 8995 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8932 +#line 8997 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8931 +#line 8996 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8934 +#line 8999 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8936 +#line 9001 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8935 +#line 9000 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8938 +#line 9003 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8940 +#line 9005 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8939 +#line 9004 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8942 +#line 9007 [TRAINER_PHILLIP] = { -#line 8943 +#line 9008 .trainerName = _("PHILLIP"), -#line 8944 +#line 9009 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8945 +#line 9010 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8947 +#line 9012 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8948 +#line 9013 .doubleBattle = FALSE, -#line 8949 +#line 9014 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8951 +#line 9016 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8953 +#line 9018 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8952 +#line 9017 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8955 +#line 9020 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8957 +#line 9022 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8956 +#line 9021 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8959 +#line 9024 [TRAINER_LEONARD] = { -#line 8960 +#line 9025 .trainerName = _("LEONARD"), -#line 8961 +#line 9026 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8962 +#line 9027 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8964 +#line 9029 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8965 +#line 9030 .doubleBattle = FALSE, -#line 8966 +#line 9031 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 8968 +#line 9033 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8970 +#line 9035 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8969 +#line 9034 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8972 +#line 9037 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8974 +#line 9039 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8973 +#line 9038 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8976 +#line 9041 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8978 +#line 9043 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8977 +#line 9042 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8980 +#line 9045 [TRAINER_DUNCAN] = { -#line 8981 +#line 9046 .trainerName = _("DUNCAN"), -#line 8982 +#line 9047 .trainerClass = TRAINER_CLASS_SAILOR, -#line 8983 +#line 9048 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 8985 +#line 9050 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8986 +#line 9051 .doubleBattle = FALSE, -#line 8987 +#line 9052 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 8989 +#line 9054 .species = SPECIES_SPHEAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8991 +#line 9056 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8990 +#line 9055 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 8993 +#line 9058 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 8995 +#line 9060 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8994 +#line 9059 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 8997 +#line 9062 [TRAINER_ERNEST_2] = { -#line 8998 +#line 9063 .trainerName = _("ERNEST"), -#line 8999 +#line 9064 .trainerClass = TRAINER_CLASS_SAILOR, -#line 9000 +#line 9065 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 9002 +#line 9067 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9003 +#line 9068 .doubleBattle = FALSE, -#line 9004 +#line 9069 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9006 +#line 9071 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9008 +#line 9073 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9007 +#line 9072 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9010 +#line 9075 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9012 +#line 9077 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9011 +#line 9076 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9014 +#line 9079 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9016 +#line 9081 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9015 +#line 9080 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9018 +#line 9083 [TRAINER_ERNEST_3] = { -#line 9019 +#line 9084 .trainerName = _("ERNEST"), -#line 9020 +#line 9085 .trainerClass = TRAINER_CLASS_SAILOR, -#line 9021 +#line 9086 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 9023 +#line 9088 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9024 +#line 9089 .doubleBattle = FALSE, -#line 9025 +#line 9090 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9027 +#line 9092 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9029 +#line 9094 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9028 +#line 9093 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9031 +#line 9096 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9033 +#line 9098 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9032 +#line 9097 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9035 +#line 9100 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9037 +#line 9102 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9036 +#line 9101 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9039 +#line 9104 [TRAINER_ERNEST_4] = { -#line 9040 +#line 9105 .trainerName = _("ERNEST"), -#line 9041 +#line 9106 .trainerClass = TRAINER_CLASS_SAILOR, -#line 9042 +#line 9107 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 9044 +#line 9109 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9045 +#line 9110 .doubleBattle = FALSE, -#line 9046 +#line 9111 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9048 +#line 9113 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9050 +#line 9115 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9049 +#line 9114 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9052 +#line 9117 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9054 +#line 9119 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9053 +#line 9118 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9056 +#line 9121 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9058 +#line 9123 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9057 +#line 9122 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9060 +#line 9125 [TRAINER_ERNEST_5] = { -#line 9061 +#line 9126 .trainerName = _("ERNEST"), -#line 9062 +#line 9127 .trainerClass = TRAINER_CLASS_SAILOR, -#line 9063 +#line 9128 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 9065 +#line 9130 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9066 +#line 9131 .doubleBattle = FALSE, -#line 9067 +#line 9132 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9069 +#line 9134 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9071 +#line 9136 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9070 +#line 9135 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9073 +#line 9138 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9075 +#line 9140 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9074 +#line 9139 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9077 +#line 9142 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9079 +#line 9144 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9078 +#line 9143 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9081 +#line 9146 [TRAINER_ELI] = { -#line 9082 +#line 9147 .trainerName = _("ELI"), -#line 9083 +#line 9148 .trainerClass = TRAINER_CLASS_HIKER, -#line 9084 +#line 9149 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 9086 +#line 9151 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 9087 +#line 9152 .doubleBattle = FALSE, -#line 9088 +#line 9153 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9090 +#line 9155 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9092 +#line 9157 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9091 +#line 9156 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9094 +#line 9159 [TRAINER_ANNIKA] = { -#line 9095 +#line 9160 .trainerName = _("ANNIKA"), -#line 9096 +#line 9161 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 9097 +#line 9162 .trainerPic = TRAINER_PIC_POKEFAN_F, .encounterMusic_gender = -#line 9098 +#line 9163 F_TRAINER_FEMALE | -#line 9099 +#line 9164 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 9100 +#line 9165 .doubleBattle = FALSE, -#line 9101 +#line 9166 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9103 +#line 9168 .species = SPECIES_FEEBAS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9103 +#line 9168 .heldItem = ITEM_ORAN_BERRY, -#line 9105 +#line 9170 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9104 +#line 9169 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9106 +#line 9171 MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, @@ -22914,19 +22914,19 @@ F_TRAINER_FEMALE | }, }, { -#line 9111 +#line 9176 .species = SPECIES_FEEBAS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9111 +#line 9176 .heldItem = ITEM_ORAN_BERRY, -#line 9113 +#line 9178 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9112 +#line 9177 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9114 +#line 9179 MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, @@ -22935,73 +22935,73 @@ F_TRAINER_FEMALE | }, }, }, -#line 9119 +#line 9184 [TRAINER_JAZMYN] = { -#line 9120 +#line 9185 .trainerName = _("JAZMYN"), -#line 9121 +#line 9186 .trainerClass = TRAINER_CLASS_COOLTRAINER_2, -#line 9122 +#line 9187 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 9123 +#line 9188 F_TRAINER_FEMALE | -#line 9124 +#line 9189 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9125 +#line 9190 .items = { ITEM_HYPER_POTION }, -#line 9126 +#line 9191 .doubleBattle = FALSE, -#line 9127 +#line 9192 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9129 +#line 9194 .species = SPECIES_ABSOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9131 +#line 9196 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9130 +#line 9195 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9133 +#line 9198 [TRAINER_JONAS] = { -#line 9134 +#line 9199 .trainerName = _("JONAS"), -#line 9135 +#line 9200 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 9136 +#line 9201 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 9138 +#line 9203 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9139 +#line 9204 .doubleBattle = FALSE, -#line 9140 +#line 9205 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9142 +#line 9207 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9144 +#line 9209 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9143 +#line 9208 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9145 +#line 9210 MOVE_TOXIC, MOVE_THUNDER, MOVE_SELF_DESTRUCT, @@ -23010,39 +23010,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 9150 +#line 9215 [TRAINER_KAYLEY] = { -#line 9151 +#line 9216 .trainerName = _("KAYLEY"), -#line 9152 +#line 9217 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 9153 +#line 9218 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 9154 +#line 9219 F_TRAINER_FEMALE | -#line 9155 +#line 9220 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9156 +#line 9221 .doubleBattle = FALSE, -#line 9157 +#line 9222 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9159 +#line 9224 .species = SPECIES_CASTFORM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9161 +#line 9226 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9160 +#line 9225 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9162 +#line 9227 MOVE_SUNNY_DAY, MOVE_WEATHER_BALL, MOVE_FLAMETHROWER, @@ -23051,224 +23051,61 @@ F_TRAINER_FEMALE | }, }, }, -#line 9167 +#line 9232 [TRAINER_AURON] = { -#line 9168 +#line 9233 .trainerName = _("AURON"), -#line 9169 +#line 9234 .trainerClass = TRAINER_CLASS_EXPERT, -#line 9170 +#line 9235 .trainerPic = TRAINER_PIC_EXPERT_M, .encounterMusic_gender = -#line 9172 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9173 - .doubleBattle = FALSE, -#line 9174 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9176 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9178 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9177 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9180 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9182 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9181 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9184 - [TRAINER_KELVIN] = - { -#line 9185 - .trainerName = _("KELVIN"), -#line 9186 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9187 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9189 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9190 - .doubleBattle = FALSE, -#line 9191 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9193 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9195 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9194 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9197 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9199 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9198 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9201 - [TRAINER_MARLEY] = - { -#line 9202 - .trainerName = _("MARLEY"), -#line 9203 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9204 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 9205 -F_TRAINER_FEMALE | -#line 9206 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9207 - .items = { ITEM_HYPER_POTION }, -#line 9208 - .doubleBattle = FALSE, -#line 9209 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9211 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9213 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 9212 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9214 - MOVE_BITE, - MOVE_ROAR, - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - }, - }, - }, - }, -#line 9219 - [TRAINER_REYNA] = - { -#line 9220 - .trainerName = _("REYNA"), -#line 9221 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 9222 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 9223 -F_TRAINER_FEMALE | -#line 9224 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9225 - .doubleBattle = FALSE, -#line 9226 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9228 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9230 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9229 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9232 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9234 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 9233 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9236 - [TRAINER_HUDSON] = - { #line 9237 - .trainerName = _("HUDSON"), + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9238 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9239 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9241 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9242 .doubleBattle = FALSE, -#line 9243 +#line 9239 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { +#line 9241 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9243 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 9242 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 9245 - .species = SPECIES_WAILMER, + .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, #line 9247 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 9246 - .lvl = 34, + .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 9249 - [TRAINER_CONOR] = + [TRAINER_KELVIN] = { #line 9250 - .trainerName = _("CONOR"), + .trainerName = _("KELVIN"), #line 9251 - .trainerClass = TRAINER_CLASS_EXPERT, + .trainerClass = TRAINER_CLASS_SAILOR, #line 9252 - .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = #line 9254 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 9255 .doubleBattle = FALSE, #line 9256 @@ -23278,10 +23115,10 @@ F_TRAINER_FEMALE | { { #line 9258 - .species = SPECIES_CHINCHOU, + .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, #line 9260 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), #line 9259 .lvl = 33, .nature = NATURE_HARDY, @@ -23289,10 +23126,10 @@ F_TRAINER_FEMALE | }, { #line 9262 - .species = SPECIES_HARIYAMA, + .species = SPECIES_SPHEAL, .gender = TRAINER_MON_RANDOM_GENDER, #line 9264 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), #line 9263 .lvl = 33, .nature = NATURE_HARDY, @@ -23301,350 +23138,513 @@ F_TRAINER_FEMALE | }, }, #line 9266 - [TRAINER_EDWIN_1] = + [TRAINER_MARLEY] = { #line 9267 - .trainerName = _("EDWIN"), + .trainerName = _("MARLEY"), #line 9268 - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 9269 - .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = +#line 9270 +F_TRAINER_FEMALE | #line 9271 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + TRAINER_ENCOUNTER_MUSIC_COOL, #line 9272 - .doubleBattle = FALSE, + .items = { ITEM_HYPER_POTION }, #line 9273 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .doubleBattle = FALSE, +#line 9274 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9275 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9277 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 9276 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9279 - .species = SPECIES_NUZLEAF, + .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9281 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9280 - .lvl = 14, +#line 9278 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 9277 + .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 9279 + MOVE_BITE, + MOVE_ROAR, + MOVE_THUNDER_WAVE, + MOVE_THUNDERBOLT, + }, }, }, }, -#line 9283 - [TRAINER_HECTOR] = - { #line 9284 - .trainerName = _("HECTOR"), + [TRAINER_REYNA] = + { #line 9285 - .trainerClass = TRAINER_CLASS_COLLECTOR, + .trainerName = _("REYNA"), #line 9286 - .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, +#line 9287 + .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = #line 9288 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +F_TRAINER_FEMALE | #line 9289 - .doubleBattle = FALSE, + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9290 + .doubleBattle = FALSE, +#line 9291 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9292 +#line 9293 + .species = SPECIES_MEDITITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9295 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 9294 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9297 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9299 + .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), +#line 9298 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 9301 + [TRAINER_HUDSON] = + { +#line 9302 + .trainerName = _("HUDSON"), +#line 9303 + .trainerClass = TRAINER_CLASS_SAILOR, +#line 9304 + .trainerPic = TRAINER_PIC_SAILOR, + .encounterMusic_gender = +#line 9306 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 9307 + .doubleBattle = FALSE, +#line 9308 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 9310 + .species = SPECIES_WAILMER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9312 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 9311 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 9314 + [TRAINER_CONOR] = + { +#line 9315 + .trainerName = _("CONOR"), +#line 9316 + .trainerClass = TRAINER_CLASS_EXPERT, +#line 9317 + .trainerPic = TRAINER_PIC_EXPERT_M, + .encounterMusic_gender = +#line 9319 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 9320 + .doubleBattle = FALSE, +#line 9321 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 9323 + .species = SPECIES_CHINCHOU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9325 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 9324 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9327 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9329 + .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), +#line 9328 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 9331 + [TRAINER_EDWIN_1] = + { +#line 9332 + .trainerName = _("EDWIN"), +#line 9333 + .trainerClass = TRAINER_CLASS_COLLECTOR, +#line 9334 + .trainerPic = TRAINER_PIC_COLLECTOR, + .encounterMusic_gender = +#line 9336 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 9337 + .doubleBattle = FALSE, +#line 9338 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 9340 + .species = SPECIES_LOMBRE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9342 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 9341 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9344 + .species = SPECIES_NUZLEAF, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9346 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 9345 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 9348 + [TRAINER_HECTOR] = + { +#line 9349 + .trainerName = _("HECTOR"), +#line 9350 + .trainerClass = TRAINER_CLASS_COLLECTOR, +#line 9351 + .trainerPic = TRAINER_PIC_COLLECTOR, + .encounterMusic_gender = +#line 9353 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 9354 + .doubleBattle = FALSE, +#line 9355 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 9357 .species = SPECIES_ZANGOOSE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9294 +#line 9359 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9293 +#line 9358 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9296 +#line 9361 .species = SPECIES_SEVIPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9298 +#line 9363 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9297 +#line 9362 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9300 +#line 9365 [TRAINER_TABITHA_MOSSDEEP] = { -#line 9301 +#line 9366 .trainerName = _("TABITHA"), -#line 9302 +#line 9367 .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 9303 +#line 9368 .trainerPic = TRAINER_PIC_MAGMA_ADMIN, .encounterMusic_gender = -#line 9305 +#line 9370 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 9306 +#line 9371 .doubleBattle = FALSE, -#line 9307 +#line 9372 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9309 +#line 9374 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9311 +#line 9376 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9310 +#line 9375 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9313 +#line 9378 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9315 +#line 9380 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9314 +#line 9379 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9317 +#line 9382 .species = SPECIES_GOLBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9319 +#line 9384 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9318 +#line 9383 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9321 +#line 9386 [TRAINER_EDWIN_2] = { -#line 9322 +#line 9387 .trainerName = _("EDWIN"), -#line 9323 +#line 9388 .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9324 +#line 9389 .trainerPic = TRAINER_PIC_COLLECTOR, .encounterMusic_gender = -#line 9326 +#line 9391 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9327 +#line 9392 .doubleBattle = FALSE, -#line 9328 +#line 9393 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9330 +#line 9395 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9332 +#line 9397 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9331 +#line 9396 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9334 +#line 9399 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9336 +#line 9401 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9335 +#line 9400 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9338 +#line 9403 [TRAINER_EDWIN_3] = { -#line 9339 +#line 9404 .trainerName = _("EDWIN"), -#line 9340 +#line 9405 .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9341 +#line 9406 .trainerPic = TRAINER_PIC_COLLECTOR, .encounterMusic_gender = -#line 9343 +#line 9408 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9344 +#line 9409 .doubleBattle = FALSE, -#line 9345 +#line 9410 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9347 +#line 9412 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9349 +#line 9414 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9348 +#line 9413 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9351 +#line 9416 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9353 +#line 9418 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9352 +#line 9417 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9355 +#line 9420 [TRAINER_EDWIN_4] = { -#line 9356 +#line 9421 .trainerName = _("EDWIN"), -#line 9357 +#line 9422 .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9358 +#line 9423 .trainerPic = TRAINER_PIC_COLLECTOR, .encounterMusic_gender = -#line 9360 +#line 9425 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9361 +#line 9426 .doubleBattle = FALSE, -#line 9362 +#line 9427 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9364 +#line 9429 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9366 +#line 9431 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9365 +#line 9430 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9368 +#line 9433 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9370 +#line 9435 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9369 +#line 9434 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9372 +#line 9437 [TRAINER_EDWIN_5] = { -#line 9373 +#line 9438 .trainerName = _("EDWIN"), -#line 9374 +#line 9439 .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9375 +#line 9440 .trainerPic = TRAINER_PIC_COLLECTOR, .encounterMusic_gender = -#line 9377 +#line 9442 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9378 +#line 9443 .doubleBattle = FALSE, -#line 9379 +#line 9444 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9381 +#line 9446 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9383 +#line 9448 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9382 +#line 9447 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9385 +#line 9450 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9387 +#line 9452 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9386 +#line 9451 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9389 +#line 9454 [TRAINER_WALLY_VR_1] = { -#line 9390 +#line 9455 .trainerName = _("WALLY"), -#line 9391 +#line 9456 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9392 +#line 9457 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 9394 +#line 9459 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9395 +#line 9460 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 9396 +#line 9461 .doubleBattle = FALSE, -#line 9397 +#line 9462 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 9399 +#line 9464 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9401 +#line 9466 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9400 +#line 9465 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9402 +#line 9467 MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, @@ -23652,17 +23652,17 @@ F_TRAINER_FEMALE | }, }, { -#line 9407 +#line 9472 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9409 +#line 9474 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9408 +#line 9473 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9410 +#line 9475 MOVE_SING, MOVE_ASSIST, MOVE_CHARM, @@ -23670,17 +23670,17 @@ F_TRAINER_FEMALE | }, }, { -#line 9415 +#line 9480 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9417 +#line 9482 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9416 +#line 9481 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9418 +#line 9483 MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, @@ -23688,17 +23688,17 @@ F_TRAINER_FEMALE | }, }, { -#line 9423 +#line 9488 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9425 +#line 9490 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9424 +#line 9489 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9426 +#line 9491 MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, @@ -23706,17 +23706,17 @@ F_TRAINER_FEMALE | }, }, { -#line 9431 +#line 9496 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9433 +#line 9498 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 9432 +#line 9497 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9434 +#line 9499 MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, @@ -23725,1014 +23725,1014 @@ F_TRAINER_FEMALE | }, }, }, -#line 9439 +#line 9504 [TRAINER_BRENDAN_ROUTE_103_MUDKIP] = { -#line 9440 +#line 9505 .trainerName = _("BRENDAN"), -#line 9441 +#line 9506 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9442 +#line 9507 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9444 +#line 9509 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9445 +#line 9510 .doubleBattle = FALSE, -#line 9446 +#line 9511 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9448 +#line 9513 .species = SPECIES_TREECKO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9450 +#line 9515 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9449 +#line 9514 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9452 +#line 9517 [TRAINER_BRENDAN_ROUTE_110_MUDKIP] = { -#line 9453 +#line 9518 .trainerName = _("BRENDAN"), -#line 9454 +#line 9519 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9455 +#line 9520 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9457 +#line 9522 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9458 +#line 9523 .doubleBattle = FALSE, -#line 9459 +#line 9524 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9461 +#line 9526 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9463 +#line 9528 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9462 +#line 9527 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9465 +#line 9530 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9467 +#line 9532 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9466 +#line 9531 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9469 +#line 9534 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9471 +#line 9536 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9470 +#line 9535 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9473 +#line 9538 [TRAINER_BRENDAN_ROUTE_119_MUDKIP] = { -#line 9474 +#line 9539 .trainerName = _("BRENDAN"), -#line 9475 +#line 9540 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9476 +#line 9541 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9478 +#line 9543 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9479 +#line 9544 .doubleBattle = FALSE, -#line 9480 +#line 9545 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9482 +#line 9547 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9484 +#line 9549 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9483 +#line 9548 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9486 +#line 9551 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9488 +#line 9553 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9487 +#line 9552 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9490 +#line 9555 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9492 +#line 9557 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9491 +#line 9556 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9494 +#line 9559 [TRAINER_BRENDAN_ROUTE_103_TREECKO] = { -#line 9495 +#line 9560 .trainerName = _("BRENDAN"), -#line 9496 +#line 9561 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9497 +#line 9562 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9499 +#line 9564 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9500 +#line 9565 .doubleBattle = FALSE, -#line 9501 +#line 9566 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9503 +#line 9568 .species = SPECIES_TORCHIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9505 +#line 9570 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9504 +#line 9569 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9507 +#line 9572 [TRAINER_BRENDAN_ROUTE_110_TREECKO] = { -#line 9508 +#line 9573 .trainerName = _("BRENDAN"), -#line 9509 +#line 9574 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9510 +#line 9575 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9512 +#line 9577 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9513 +#line 9578 .doubleBattle = FALSE, -#line 9514 +#line 9579 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9516 +#line 9581 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9518 +#line 9583 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9517 +#line 9582 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9520 +#line 9585 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9522 +#line 9587 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9521 +#line 9586 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9524 +#line 9589 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9526 +#line 9591 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9525 +#line 9590 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9528 +#line 9593 [TRAINER_BRENDAN_ROUTE_119_TREECKO] = { -#line 9529 +#line 9594 .trainerName = _("BRENDAN"), -#line 9530 +#line 9595 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9531 +#line 9596 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9533 +#line 9598 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9534 +#line 9599 .doubleBattle = FALSE, -#line 9535 +#line 9600 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9537 +#line 9602 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9539 +#line 9604 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9538 +#line 9603 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9541 +#line 9606 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9543 +#line 9608 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9542 +#line 9607 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9545 +#line 9610 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9547 +#line 9612 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9546 +#line 9611 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9549 +#line 9614 [TRAINER_BRENDAN_ROUTE_103_TORCHIC] = { -#line 9550 +#line 9615 .trainerName = _("BRENDAN"), -#line 9551 +#line 9616 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9552 +#line 9617 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9554 +#line 9619 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9555 +#line 9620 .doubleBattle = FALSE, -#line 9556 +#line 9621 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9558 +#line 9623 .species = SPECIES_MUDKIP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9560 +#line 9625 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9559 +#line 9624 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9562 +#line 9627 [TRAINER_BRENDAN_ROUTE_110_TORCHIC] = { -#line 9563 +#line 9628 .trainerName = _("BRENDAN"), -#line 9564 +#line 9629 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9565 +#line 9630 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9567 +#line 9632 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9568 +#line 9633 .doubleBattle = FALSE, -#line 9569 +#line 9634 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9571 +#line 9636 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9573 +#line 9638 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9572 +#line 9637 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9575 +#line 9640 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9577 +#line 9642 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9576 +#line 9641 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9579 +#line 9644 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9581 +#line 9646 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9580 +#line 9645 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9583 +#line 9648 [TRAINER_BRENDAN_ROUTE_119_TORCHIC] = { -#line 9584 +#line 9649 .trainerName = _("BRENDAN"), -#line 9585 +#line 9650 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9586 +#line 9651 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 9588 +#line 9653 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9589 +#line 9654 .doubleBattle = FALSE, -#line 9590 +#line 9655 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9592 +#line 9657 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9594 +#line 9659 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9593 +#line 9658 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9596 +#line 9661 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9598 +#line 9663 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9597 +#line 9662 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9600 +#line 9665 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9602 +#line 9667 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9601 +#line 9666 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9604 +#line 9669 [TRAINER_MAY_ROUTE_103_MUDKIP] = { -#line 9605 +#line 9670 .trainerName = _("MAY"), -#line 9606 +#line 9671 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9607 +#line 9672 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9608 +#line 9673 F_TRAINER_FEMALE | -#line 9609 +#line 9674 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9610 +#line 9675 .doubleBattle = FALSE, -#line 9611 +#line 9676 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9613 +#line 9678 .species = SPECIES_TREECKO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9615 +#line 9680 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9614 +#line 9679 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9617 +#line 9682 [TRAINER_MAY_ROUTE_110_MUDKIP] = { -#line 9618 +#line 9683 .trainerName = _("MAY"), -#line 9619 +#line 9684 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9620 +#line 9685 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9621 +#line 9686 F_TRAINER_FEMALE | -#line 9622 +#line 9687 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9623 +#line 9688 .doubleBattle = FALSE, -#line 9624 +#line 9689 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9626 +#line 9691 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9628 +#line 9693 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9627 +#line 9692 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9630 +#line 9695 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9632 +#line 9697 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9631 +#line 9696 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9634 +#line 9699 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9636 +#line 9701 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9635 +#line 9700 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9638 +#line 9703 [TRAINER_MAY_ROUTE_119_MUDKIP] = { -#line 9639 +#line 9704 .trainerName = _("MAY"), -#line 9640 +#line 9705 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9641 +#line 9706 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9642 +#line 9707 F_TRAINER_FEMALE | -#line 9643 +#line 9708 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9644 +#line 9709 .doubleBattle = FALSE, -#line 9645 +#line 9710 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9647 +#line 9712 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9649 +#line 9714 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9648 +#line 9713 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9651 +#line 9716 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9653 +#line 9718 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9652 +#line 9717 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9655 +#line 9720 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9657 +#line 9722 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9656 +#line 9721 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9659 +#line 9724 [TRAINER_MAY_ROUTE_103_TREECKO] = { -#line 9660 +#line 9725 .trainerName = _("MAY"), -#line 9661 +#line 9726 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9662 +#line 9727 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9663 +#line 9728 F_TRAINER_FEMALE | -#line 9664 +#line 9729 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9665 +#line 9730 .doubleBattle = FALSE, -#line 9666 +#line 9731 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9668 +#line 9733 .species = SPECIES_TORCHIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9670 +#line 9735 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9669 +#line 9734 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9672 +#line 9737 [TRAINER_MAY_ROUTE_110_TREECKO] = { -#line 9673 +#line 9738 .trainerName = _("MAY"), -#line 9674 +#line 9739 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9675 +#line 9740 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9676 +#line 9741 F_TRAINER_FEMALE | -#line 9677 +#line 9742 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9678 +#line 9743 .doubleBattle = FALSE, -#line 9679 +#line 9744 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9681 +#line 9746 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9683 +#line 9748 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9682 +#line 9747 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9685 +#line 9750 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9687 +#line 9752 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9686 +#line 9751 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9689 +#line 9754 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9691 +#line 9756 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9690 +#line 9755 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9693 +#line 9758 [TRAINER_MAY_ROUTE_119_TREECKO] = { -#line 9694 +#line 9759 .trainerName = _("MAY"), -#line 9695 +#line 9760 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9696 +#line 9761 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9697 +#line 9762 F_TRAINER_FEMALE | -#line 9698 +#line 9763 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9699 +#line 9764 .doubleBattle = FALSE, -#line 9700 +#line 9765 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9702 +#line 9767 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9704 +#line 9769 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9703 +#line 9768 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9706 +#line 9771 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9708 +#line 9773 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9707 +#line 9772 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9710 +#line 9775 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9712 +#line 9777 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9711 +#line 9776 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9714 +#line 9779 [TRAINER_MAY_ROUTE_103_TORCHIC] = { -#line 9715 +#line 9780 .trainerName = _("MAY"), -#line 9716 +#line 9781 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9717 +#line 9782 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9718 +#line 9783 F_TRAINER_FEMALE | -#line 9719 +#line 9784 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9720 +#line 9785 .doubleBattle = FALSE, -#line 9721 +#line 9786 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9723 +#line 9788 .species = SPECIES_MUDKIP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9725 +#line 9790 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9724 +#line 9789 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9727 +#line 9792 [TRAINER_MAY_ROUTE_110_TORCHIC] = { -#line 9728 +#line 9793 .trainerName = _("MAY"), -#line 9729 +#line 9794 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9730 +#line 9795 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9731 +#line 9796 F_TRAINER_FEMALE | -#line 9732 +#line 9797 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9733 +#line 9798 .doubleBattle = FALSE, -#line 9734 +#line 9799 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9736 +#line 9801 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9738 +#line 9803 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9737 +#line 9802 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9740 +#line 9805 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9742 +#line 9807 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9741 +#line 9806 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9744 +#line 9809 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9746 +#line 9811 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9745 +#line 9810 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9748 +#line 9813 [TRAINER_MAY_ROUTE_119_TORCHIC] = { -#line 9749 +#line 9814 .trainerName = _("MAY"), -#line 9750 +#line 9815 .trainerClass = TRAINER_CLASS_RIVAL, -#line 9751 +#line 9816 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 9752 +#line 9817 F_TRAINER_FEMALE | -#line 9753 +#line 9818 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9754 +#line 9819 .doubleBattle = FALSE, -#line 9755 +#line 9820 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 9757 +#line 9822 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9759 +#line 9824 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9758 +#line 9823 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9761 +#line 9826 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9763 +#line 9828 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9762 +#line 9827 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9765 +#line 9830 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9767 +#line 9832 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9766 +#line 9831 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9769 +#line 9834 [TRAINER_ISAAC_1] = { -#line 9770 +#line 9835 .trainerName = _("ISAAC"), -#line 9771 +#line 9836 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9772 +#line 9837 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, .encounterMusic_gender = -#line 9774 +#line 9839 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9775 +#line 9840 .doubleBattle = FALSE, -#line 9776 +#line 9841 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 9778 +#line 9843 .species = SPECIES_WHISMUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9780 +#line 9845 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9779 +#line 9844 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9782 +#line 9847 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9784 +#line 9849 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9783 +#line 9848 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9786 +#line 9851 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9788 +#line 9853 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9787 +#line 9852 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9790 +#line 9855 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9792 +#line 9857 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9791 +#line 9856 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9794 +#line 9859 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9796 +#line 9861 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9795 +#line 9860 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9798 +#line 9863 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9800 +#line 9865 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9799 +#line 9864 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9802 +#line 9867 [TRAINER_DAVIS] = { -#line 9803 +#line 9868 .trainerName = _("DAVIS"), -#line 9804 +#line 9869 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 9805 +#line 9870 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 9807 +#line 9872 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9808 +#line 9873 .doubleBattle = FALSE, -#line 9809 +#line 9874 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 9811 +#line 9876 .species = SPECIES_PINSIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9813 +#line 9878 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9812 +#line 9877 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9815 +#line 9880 [TRAINER_MITCHELL] = { -#line 9816 +#line 9881 .trainerName = _("MITCHELL"), -#line 9817 +#line 9882 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9818 +#line 9883 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 9820 +#line 9885 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9821 +#line 9886 .doubleBattle = FALSE, -#line 9822 +#line 9887 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 9824 +#line 9889 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9826 +#line 9891 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9825 +#line 9890 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9827 +#line 9892 MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, @@ -24740,17 +24740,17 @@ F_TRAINER_FEMALE | }, }, { -#line 9832 +#line 9897 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9834 +#line 9899 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9833 +#line 9898 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 9835 +#line 9900 MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, @@ -24759,939 +24759,771 @@ F_TRAINER_FEMALE | }, }, }, -#line 9840 +#line 9905 [TRAINER_ISAAC_2] = { -#line 9841 +#line 9906 .trainerName = _("ISAAC"), -#line 9842 +#line 9907 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9843 +#line 9908 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, .encounterMusic_gender = -#line 9845 +#line 9910 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9846 +#line 9911 .doubleBattle = FALSE, -#line 9847 +#line 9912 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 9849 +#line 9914 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9851 +#line 9916 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9850 +#line 9915 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9853 +#line 9918 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9855 +#line 9920 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9854 +#line 9919 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9857 +#line 9922 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9859 +#line 9924 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9858 +#line 9923 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9861 +#line 9926 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9863 +#line 9928 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9862 +#line 9927 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9865 +#line 9930 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9867 +#line 9932 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9866 +#line 9931 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9869 +#line 9934 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9871 +#line 9936 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9870 +#line 9935 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9873 +#line 9938 [TRAINER_ISAAC_3] = { -#line 9874 +#line 9939 .trainerName = _("ISAAC"), -#line 9875 +#line 9940 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9876 +#line 9941 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, .encounterMusic_gender = -#line 9878 +#line 9943 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9879 +#line 9944 .doubleBattle = FALSE, -#line 9880 +#line 9945 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 9882 +#line 9947 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9884 +#line 9949 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9883 +#line 9948 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9886 +#line 9951 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9888 +#line 9953 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9887 +#line 9952 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9890 +#line 9955 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9892 +#line 9957 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9891 +#line 9956 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9894 +#line 9959 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9896 +#line 9961 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9895 +#line 9960 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9898 +#line 9963 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9900 +#line 9965 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9899 +#line 9964 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9902 +#line 9967 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9904 +#line 9969 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9903 +#line 9968 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 9906 +#line 9971 [TRAINER_ISAAC_4] = { -#line 9907 - .trainerName = _("ISAAC"), -#line 9908 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9909 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9911 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9912 - .doubleBattle = FALSE, -#line 9913 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9915 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9917 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9916 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9919 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9921 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9920 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9923 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9925 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9924 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9927 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9929 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9928 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9931 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9933 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9932 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9935 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9937 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9936 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9939 - [TRAINER_ISAAC_5] = - { -#line 9940 - .trainerName = _("ISAAC"), -#line 9941 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9942 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9944 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9945 - .doubleBattle = FALSE, -#line 9946 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9948 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9950 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9949 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9952 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9954 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9953 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9956 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9958 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9957 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9960 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9962 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9961 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9964 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9966 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9965 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9968 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9970 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9969 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, #line 9972 - [TRAINER_LYDIA_1] = - { + .trainerName = _("ISAAC"), #line 9973 - .trainerName = _("LYDIA"), -#line 9974 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9975 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, +#line 9974 + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, .encounterMusic_gender = #line 9976 -F_TRAINER_FEMALE | + TRAINER_ENCOUNTER_MUSIC_MALE, #line 9977 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9978 .doubleBattle = FALSE, -#line 9979 +#line 9978 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { +#line 9980 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9982 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 9981 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9984 + .species = SPECIES_LINOONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9986 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 9985 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9988 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9990 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 9989 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9992 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9994 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 9993 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 9996 + .species = SPECIES_SWELLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 9998 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 9997 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10000 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10002 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 10001 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10004 + [TRAINER_ISAAC_5] = + { +#line 10005 + .trainerName = _("ISAAC"), +#line 10006 + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, +#line 10007 + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .encounterMusic_gender = +#line 10009 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 10010 + .doubleBattle = FALSE, +#line 10011 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 6, + .party = (const struct TrainerMon[]) + { + { +#line 10013 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10015 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10014 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10017 + .species = SPECIES_LINOONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10019 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10018 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10021 + .species = SPECIES_LAIRON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10023 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10022 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10025 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10027 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10026 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10029 + .species = SPECIES_SWELLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10031 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10030 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10033 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10035 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10034 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10037 + [TRAINER_LYDIA_1] = + { +#line 10038 + .trainerName = _("LYDIA"), +#line 10039 + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, +#line 10040 + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .encounterMusic_gender = +#line 10041 +F_TRAINER_FEMALE | +#line 10042 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 10043 + .doubleBattle = FALSE, +#line 10044 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 6, + .party = (const struct TrainerMon[]) + { + { +#line 10046 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9983 +#line 10048 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9982 +#line 10047 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9985 +#line 10050 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9987 +#line 10052 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9986 +#line 10051 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9989 +#line 10054 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9991 +#line 10056 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9990 +#line 10055 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9993 +#line 10058 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9995 +#line 10060 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9994 +#line 10059 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 9997 +#line 10062 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 9999 +#line 10064 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9998 +#line 10063 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10001 +#line 10066 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10003 +#line 10068 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10002 +#line 10067 .lvl = 11, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10005 +#line 10070 [TRAINER_HALLE] = { -#line 10006 +#line 10071 .trainerName = _("HALLE"), -#line 10007 +#line 10072 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10008 +#line 10073 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 10009 +#line 10074 F_TRAINER_FEMALE | -#line 10010 +#line 10075 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10011 +#line 10076 .items = { ITEM_FULL_RESTORE }, -#line 10012 +#line 10077 .doubleBattle = FALSE, -#line 10013 +#line 10078 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10015 +#line 10080 .species = SPECIES_SABLEYE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10017 +#line 10082 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10016 +#line 10081 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10019 +#line 10084 .species = SPECIES_ABSOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10021 +#line 10086 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10020 +#line 10085 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10023 +#line 10088 [TRAINER_GARRISON] = { -#line 10024 +#line 10089 .trainerName = _("GARRISON"), -#line 10025 +#line 10090 .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 10026 +#line 10091 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 10028 +#line 10093 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10029 +#line 10094 .doubleBattle = FALSE, -#line 10030 +#line 10095 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10032 +#line 10097 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10034 +#line 10099 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10033 +#line 10098 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10036 +#line 10101 [TRAINER_LYDIA_2] = { -#line 10037 +#line 10102 .trainerName = _("LYDIA"), -#line 10038 +#line 10103 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10039 +#line 10104 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 10040 +#line 10105 F_TRAINER_FEMALE | -#line 10041 +#line 10106 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10042 +#line 10107 .doubleBattle = FALSE, -#line 10043 +#line 10108 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 10045 +#line 10110 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10047 +#line 10112 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10046 +#line 10111 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10049 +#line 10114 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10051 +#line 10116 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10050 +#line 10115 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10053 +#line 10118 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10055 +#line 10120 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10054 +#line 10119 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10057 +#line 10122 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10059 +#line 10124 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10058 +#line 10123 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10061 +#line 10126 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10063 +#line 10128 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10062 +#line 10127 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10065 +#line 10130 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10067 +#line 10132 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10066 +#line 10131 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10069 +#line 10134 [TRAINER_LYDIA_3] = { -#line 10070 +#line 10135 .trainerName = _("LYDIA"), -#line 10071 +#line 10136 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10072 +#line 10137 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 10073 +#line 10138 F_TRAINER_FEMALE | -#line 10074 +#line 10139 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10075 +#line 10140 .doubleBattle = FALSE, -#line 10076 +#line 10141 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 10078 +#line 10143 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10080 +#line 10145 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10079 +#line 10144 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10082 +#line 10147 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10084 +#line 10149 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10083 +#line 10148 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10086 +#line 10151 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10088 +#line 10153 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10087 +#line 10152 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10090 +#line 10155 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10092 +#line 10157 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10091 +#line 10156 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10094 +#line 10159 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10096 +#line 10161 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10095 +#line 10160 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10098 +#line 10163 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10100 +#line 10165 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10099 +#line 10164 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10102 +#line 10167 [TRAINER_LYDIA_4] = { -#line 10103 +#line 10168 .trainerName = _("LYDIA"), -#line 10104 +#line 10169 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10105 +#line 10170 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 10106 +#line 10171 F_TRAINER_FEMALE | -#line 10107 +#line 10172 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10108 +#line 10173 .doubleBattle = FALSE, -#line 10109 +#line 10174 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 10111 +#line 10176 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10113 +#line 10178 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10112 +#line 10177 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10115 +#line 10180 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10117 +#line 10182 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10116 +#line 10181 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10119 +#line 10184 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10121 +#line 10186 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10120 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10123 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10125 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10124 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10127 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10129 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10128 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10131 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10133 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10132 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10135 - [TRAINER_LYDIA_5] = - { -#line 10136 - .trainerName = _("LYDIA"), -#line 10137 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10138 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10139 -F_TRAINER_FEMALE | -#line 10140 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10141 - .doubleBattle = FALSE, -#line 10142 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10144 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10146 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10145 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10148 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10150 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10149 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10152 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10154 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10153 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10156 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10158 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10157 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10160 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10162 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10161 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10164 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10166 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10165 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10168 - [TRAINER_JACKSON_1] = - { -#line 10169 - .trainerName = _("JACKSON"), -#line 10170 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10171 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10173 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10174 - .items = { ITEM_FULL_RESTORE }, -#line 10175 - .doubleBattle = FALSE, -#line 10176 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10178 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10180 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10179 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10182 - [TRAINER_LORENZO] = - { -#line 10183 - .trainerName = _("LORENZO"), -#line 10184 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10185 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10187 - TRAINER_ENCOUNTER_MUSIC_COOL, + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 10188 - .items = { ITEM_FULL_RESTORE }, -#line 10189 - .doubleBattle = FALSE, + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, #line 10190 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 10189 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 10192 - .species = SPECIES_SEEDOT, + .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, #line 10194 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 10193 .lvl = 28, .nature = NATURE_HARDY, @@ -25699,1198 +25531,1202 @@ F_TRAINER_FEMALE | }, { #line 10196 - .species = SPECIES_NUZLEAF, + .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, #line 10198 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 10197 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - { + }, + }, #line 10200 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10202 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), + [TRAINER_LYDIA_5] = + { #line 10201 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, + .trainerName = _("LYDIA"), +#line 10202 + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, +#line 10203 + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .encounterMusic_gender = #line 10204 - [TRAINER_SEBASTIAN] = - { +F_TRAINER_FEMALE | #line 10205 - .trainerName = _("SEBASTIAN"), + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10206 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10207 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10209 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10210 - .items = { ITEM_FULL_RESTORE }, -#line 10211 .doubleBattle = FALSE, -#line 10212 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, +#line 10207 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 10214 - .species = SPECIES_CACTURNE, +#line 10209 + .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10216 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10215 - .lvl = 39, +#line 10211 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10210 + .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - }, - }, -#line 10218 - [TRAINER_JACKSON_2] = - { -#line 10219 - .trainerName = _("JACKSON"), -#line 10220 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10221 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10223 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10224 - .items = { ITEM_FULL_RESTORE }, -#line 10225 - .doubleBattle = FALSE, -#line 10226 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { { -#line 10228 +#line 10213 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10230 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), +#line 10215 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10214 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10217 + .species = SPECIES_AZUMARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10219 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10218 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10221 + .species = SPECIES_ROSELIA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10223 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10222 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10225 + .species = SPECIES_DELCATTY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10227 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10226 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 10229 + .species = SPECIES_SEAKING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10231 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 10230 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10232 - [TRAINER_JACKSON_3] = - { #line 10233 - .trainerName = _("JACKSON"), + [TRAINER_JACKSON_1] = + { #line 10234 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .trainerName = _("JACKSON"), #line 10235 + .trainerClass = TRAINER_CLASS_PKMN_RANGER, +#line 10236 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .encounterMusic_gender = -#line 10237 - TRAINER_ENCOUNTER_MUSIC_COOL, #line 10238 - .items = { ITEM_FULL_RESTORE }, + TRAINER_ENCOUNTER_MUSIC_COOL, #line 10239 - .doubleBattle = FALSE, + .items = { ITEM_FULL_RESTORE }, #line 10240 + .doubleBattle = FALSE, +#line 10241 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10242 +#line 10243 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, +#line 10245 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), #line 10244 + .lvl = 27, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10247 + [TRAINER_LORENZO] = + { +#line 10248 + .trainerName = _("LORENZO"), +#line 10249 + .trainerClass = TRAINER_CLASS_PKMN_RANGER, +#line 10250 + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .encounterMusic_gender = +#line 10252 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 10253 + .items = { ITEM_FULL_RESTORE }, +#line 10254 + .doubleBattle = FALSE, +#line 10255 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 10257 + .species = SPECIES_SEEDOT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10259 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10258 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10261 + .species = SPECIES_NUZLEAF, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10263 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10262 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10265 + .species = SPECIES_LOMBRE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10267 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10266 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10269 + [TRAINER_SEBASTIAN] = + { +#line 10270 + .trainerName = _("SEBASTIAN"), +#line 10271 + .trainerClass = TRAINER_CLASS_PKMN_RANGER, +#line 10272 + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .encounterMusic_gender = +#line 10274 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 10275 + .items = { ITEM_FULL_RESTORE }, +#line 10276 + .doubleBattle = FALSE, +#line 10277 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10279 + .species = SPECIES_CACTURNE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10281 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10280 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10283 + [TRAINER_JACKSON_2] = + { +#line 10284 + .trainerName = _("JACKSON"), +#line 10285 + .trainerClass = TRAINER_CLASS_PKMN_RANGER, +#line 10286 + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .encounterMusic_gender = +#line 10288 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 10289 + .items = { ITEM_FULL_RESTORE }, +#line 10290 + .doubleBattle = FALSE, +#line 10291 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10293 + .species = SPECIES_BRELOOM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10295 + .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), +#line 10294 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10297 + [TRAINER_JACKSON_3] = + { +#line 10298 + .trainerName = _("JACKSON"), +#line 10299 + .trainerClass = TRAINER_CLASS_PKMN_RANGER, +#line 10300 + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .encounterMusic_gender = +#line 10302 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 10303 + .items = { ITEM_FULL_RESTORE }, +#line 10304 + .doubleBattle = FALSE, +#line 10305 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10307 + .species = SPECIES_BRELOOM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10309 .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10243 +#line 10308 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10246 +#line 10311 [TRAINER_JACKSON_4] = { -#line 10247 +#line 10312 .trainerName = _("JACKSON"), -#line 10248 +#line 10313 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10249 +#line 10314 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .encounterMusic_gender = -#line 10251 +#line 10316 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10252 +#line 10317 .items = { ITEM_FULL_RESTORE }, -#line 10253 +#line 10318 .doubleBattle = FALSE, -#line 10254 +#line 10319 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10256 +#line 10321 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10258 +#line 10323 .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10257 +#line 10322 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10260 +#line 10325 [TRAINER_JACKSON_5] = { -#line 10261 +#line 10326 .trainerName = _("JACKSON"), -#line 10262 +#line 10327 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10263 +#line 10328 .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, .encounterMusic_gender = -#line 10265 +#line 10330 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10266 +#line 10331 .items = { ITEM_FULL_RESTORE }, -#line 10267 +#line 10332 .doubleBattle = FALSE, -#line 10268 +#line 10333 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10270 +#line 10335 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10272 +#line 10337 .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10271 +#line 10336 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10274 +#line 10339 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10276 +#line 10341 .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10275 +#line 10340 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10278 +#line 10343 [TRAINER_CATHERINE_1] = { -#line 10279 +#line 10344 .trainerName = _("CATHERINE"), -#line 10280 +#line 10345 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10281 +#line 10346 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10282 +#line 10347 F_TRAINER_FEMALE | -#line 10283 +#line 10348 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10284 +#line 10349 .items = { ITEM_FULL_RESTORE }, -#line 10285 +#line 10350 .doubleBattle = FALSE, -#line 10286 +#line 10351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10288 +#line 10353 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10290 +#line 10355 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10289 +#line 10354 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10292 +#line 10357 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10294 +#line 10359 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10293 +#line 10358 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10296 +#line 10361 [TRAINER_JENNA] = { -#line 10297 +#line 10362 .trainerName = _("JENNA"), -#line 10298 +#line 10363 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10299 +#line 10364 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10300 +#line 10365 F_TRAINER_FEMALE | -#line 10301 +#line 10366 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10302 +#line 10367 .items = { ITEM_FULL_RESTORE }, -#line 10303 +#line 10368 .doubleBattle = FALSE, -#line 10304 +#line 10369 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 10306 +#line 10371 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10308 +#line 10373 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10307 +#line 10372 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10310 +#line 10375 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10312 +#line 10377 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10311 +#line 10376 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10314 +#line 10379 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10316 +#line 10381 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10315 +#line 10380 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10318 +#line 10383 [TRAINER_SOPHIA] = { -#line 10319 +#line 10384 .trainerName = _("SOPHIA"), -#line 10320 +#line 10385 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10321 +#line 10386 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10322 +#line 10387 F_TRAINER_FEMALE | -#line 10323 +#line 10388 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10324 +#line 10389 .items = { ITEM_FULL_RESTORE }, -#line 10325 +#line 10390 .doubleBattle = FALSE, -#line 10326 +#line 10391 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10328 +#line 10393 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10330 +#line 10395 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10329 +#line 10394 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10332 +#line 10397 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10334 +#line 10399 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10333 +#line 10398 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10336 +#line 10401 [TRAINER_CATHERINE_2] = { -#line 10337 +#line 10402 .trainerName = _("CATHERINE"), -#line 10338 +#line 10403 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10339 +#line 10404 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10340 +#line 10405 F_TRAINER_FEMALE | -#line 10341 +#line 10406 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10342 +#line 10407 .items = { ITEM_FULL_RESTORE }, -#line 10343 +#line 10408 .doubleBattle = FALSE, -#line 10344 +#line 10409 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10346 +#line 10411 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10348 +#line 10413 .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10347 +#line 10412 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10350 +#line 10415 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10352 +#line 10417 .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10351 +#line 10416 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10354 +#line 10419 [TRAINER_CATHERINE_3] = { -#line 10355 +#line 10420 .trainerName = _("CATHERINE"), -#line 10356 +#line 10421 .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10357 +#line 10422 .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10358 +#line 10423 F_TRAINER_FEMALE | -#line 10359 +#line 10424 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10360 +#line 10425 .items = { ITEM_FULL_RESTORE }, -#line 10361 +#line 10426 .doubleBattle = FALSE, -#line 10362 +#line 10427 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10364 +#line 10429 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10366 +#line 10431 .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10365 +#line 10430 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10368 +#line 10433 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10370 +#line 10435 .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10369 +#line 10434 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10372 +#line 10437 [TRAINER_CATHERINE_4] = { -#line 10373 - .trainerName = _("CATHERINE"), -#line 10374 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10375 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10376 -F_TRAINER_FEMALE | -#line 10377 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10378 - .items = { ITEM_FULL_RESTORE }, -#line 10379 - .doubleBattle = FALSE, -#line 10380 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10382 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10384 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10383 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10386 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10388 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10387 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10390 - [TRAINER_CATHERINE_5] = - { -#line 10391 - .trainerName = _("CATHERINE"), -#line 10392 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10393 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10394 -F_TRAINER_FEMALE | -#line 10395 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10396 - .items = { ITEM_FULL_RESTORE }, -#line 10397 - .doubleBattle = FALSE, -#line 10398 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10400 - .species = SPECIES_BELLOSSOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10402 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10401 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10404 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10406 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10405 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10408 - [TRAINER_JULIO] = - { -#line 10409 - .trainerName = _("JULIO"), -#line 10410 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10411 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 10413 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10414 - .doubleBattle = FALSE, -#line 10415 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10417 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10419 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10418 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10421 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = - { -#line 10422 - .trainerName = _("GRUNT"), -#line 10423 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10424 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 10426 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10427 - .doubleBattle = FALSE, -#line 10428 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10430 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10432 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10431 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10434 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10436 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10435 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, #line 10438 - [TRAINER_GRUNT_UNUSED] = - { + .trainerName = _("CATHERINE"), #line 10439 - .trainerName = _("GRUNT"), + .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10440 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10441 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = -#line 10442 +#line 10441 F_TRAINER_FEMALE | +#line 10442 + TRAINER_ENCOUNTER_MUSIC_COOL, #line 10443 - TRAINER_ENCOUNTER_MUSIC_AQUA, + .items = { ITEM_FULL_RESTORE }, #line 10444 .doubleBattle = FALSE, #line 10445 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { #line 10447 - .species = SPECIES_WAILMER, + .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, #line 10449 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), #line 10448 - .lvl = 31, + .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 10451 - .species = SPECIES_ZUBAT, + .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, #line 10453 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), #line 10452 - .lvl = 31, + .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 10455 - [TRAINER_GRUNT_MT_PYRE_4] = + [TRAINER_CATHERINE_5] = { #line 10456 - .trainerName = _("GRUNT"), + .trainerName = _("CATHERINE"), #line 10457 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, #line 10458 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, .encounterMusic_gender = #line 10459 F_TRAINER_FEMALE | #line 10460 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10461 - .doubleBattle = FALSE, -#line 10462 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10464 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10466 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10465 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10468 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10470 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10469 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10472 - [TRAINER_GRUNT_JAGGED_PASS] = - { -#line 10473 - .trainerName = _("GRUNT"), -#line 10474 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10475 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10477 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10478 - .doubleBattle = FALSE, -#line 10479 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10481 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10483 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10482 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10485 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10487 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10486 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10489 - [TRAINER_MARC] = - { -#line 10490 - .trainerName = _("MARC"), -#line 10491 - .trainerClass = TRAINER_CLASS_HIKER, -#line 10492 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 10494 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10495 - .doubleBattle = FALSE, -#line 10496 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10498 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10500 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 10499 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10502 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10504 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 10503 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10506 - [TRAINER_BRENDEN] = - { -#line 10507 - .trainerName = _("BRENDEN"), -#line 10508 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 10509 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 10511 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10512 - .doubleBattle = FALSE, -#line 10513 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10515 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10517 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10516 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10519 - [TRAINER_LILITH] = - { -#line 10520 - .trainerName = _("LILITH"), -#line 10521 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 10522 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 10523 -F_TRAINER_FEMALE | -#line 10524 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10525 - .doubleBattle = FALSE, -#line 10526 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10528 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10530 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10529 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10532 - [TRAINER_CRISTIAN] = - { -#line 10533 - .trainerName = _("CRISTIAN"), -#line 10534 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 10535 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 10537 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10538 - .doubleBattle = FALSE, -#line 10539 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10541 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10543 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 10542 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10545 - [TRAINER_SYLVIA] = - { -#line 10546 - .trainerName = _("SYLVIA"), -#line 10547 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 10548 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 10549 -F_TRAINER_FEMALE | -#line 10550 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 10551 - .doubleBattle = FALSE, -#line 10552 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10554 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10556 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10555 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10558 - [TRAINER_LEONARDO] = - { -#line 10559 - .trainerName = _("LEONARDO"), -#line 10560 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10561 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10563 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10564 - .doubleBattle = FALSE, -#line 10565 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10567 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10569 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10568 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10571 - [TRAINER_ATHENA] = - { -#line 10572 - .trainerName = _("ATHENA"), -#line 10573 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10574 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 10575 -F_TRAINER_FEMALE | -#line 10576 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10577 - .items = { ITEM_HYPER_POTION }, -#line 10578 +#line 10461 + .items = { ITEM_FULL_RESTORE }, +#line 10462 .doubleBattle = FALSE, -#line 10579 +#line 10463 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10581 - .species = SPECIES_MANECTRIC, +#line 10465 + .species = SPECIES_BELLOSSOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10583 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10582 - .lvl = 32, +#line 10467 + .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), +#line 10466 + .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10584 - MOVE_THUNDER, - MOVE_THUNDER_WAVE, - MOVE_QUICK_ATTACK, - }, }, { -#line 10588 - .species = SPECIES_LINOONE, +#line 10469 + .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10590 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10589 - .lvl = 32, +#line 10471 + .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), +#line 10470 + .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10591 - MOVE_SURF, - MOVE_THIEF, - }, }, }, }, -#line 10594 - [TRAINER_HARRISON] = +#line 10473 + [TRAINER_JULIO] = { -#line 10595 - .trainerName = _("HARRISON"), -#line 10596 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10597 - .trainerPic = TRAINER_PIC_SWIMMER_M, +#line 10474 + .trainerName = _("JULIO"), +#line 10475 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 10476 + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, .encounterMusic_gender = -#line 10599 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10600 +#line 10478 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 10479 .doubleBattle = FALSE, -#line 10601 +#line 10480 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10603 - .species = SPECIES_TENTACRUEL, +#line 10482 + .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10605 +#line 10484 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10604 +#line 10483 + .lvl = 21, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10486 + [TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = + { +#line 10487 + .trainerName = _("GRUNT"), +#line 10488 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 10489 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .encounterMusic_gender = +#line 10491 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 10492 + .doubleBattle = FALSE, +#line 10493 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10495 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10497 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10496 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10499 + .species = SPECIES_GOLBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10501 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10500 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10607 - [TRAINER_GRUNT_MT_CHIMNEY_2] = +#line 10503 + [TRAINER_GRUNT_UNUSED] = { -#line 10608 +#line 10504 .trainerName = _("GRUNT"), -#line 10609 +#line 10505 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10610 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, +#line 10506 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 10612 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10613 +#line 10507 +F_TRAINER_FEMALE | +#line 10508 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 10509 .doubleBattle = FALSE, -#line 10614 +#line 10510 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10616 +#line 10512 + .species = SPECIES_WAILMER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10514 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10513 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10516 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10618 +#line 10518 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10617 - .lvl = 20, +#line 10517 + .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10620 - [TRAINER_CLARENCE] = +#line 10520 + [TRAINER_GRUNT_MT_PYRE_4] = { -#line 10621 - .trainerName = _("CLARENCE"), -#line 10622 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10623 - .trainerPic = TRAINER_PIC_SWIMMER_M, +#line 10521 + .trainerName = _("GRUNT"), +#line 10522 + .trainerClass = TRAINER_CLASS_TEAM_AQUA, +#line 10523 + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 10625 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10626 - .doubleBattle = FALSE, -#line 10627 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10629 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10631 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10630 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10633 - [TRAINER_TERRY] = - { -#line 10634 - .trainerName = _("TERRY"), -#line 10635 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10636 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10637 +#line 10524 F_TRAINER_FEMALE | -#line 10638 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10639 +#line 10525 + TRAINER_ENCOUNTER_MUSIC_AQUA, +#line 10526 .doubleBattle = FALSE, -#line 10640 +#line 10527 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10642 - .species = SPECIES_GIRAFARIG, +#line 10529 + .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10644 +#line 10531 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10643 - .lvl = 37, +#line 10530 + .lvl = 30, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10533 + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10535 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10534 + .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10646 - [TRAINER_NATE] = +#line 10537 + [TRAINER_GRUNT_JAGGED_PASS] = { -#line 10647 - .trainerName = _("NATE"), -#line 10648 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 10649 - .trainerPic = TRAINER_PIC_GENTLEMAN, +#line 10538 + .trainerName = _("GRUNT"), +#line 10539 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 10540 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 10651 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 10652 +#line 10542 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 10543 .doubleBattle = FALSE, -#line 10653 +#line 10544 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10546 + .species = SPECIES_POOCHYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10548 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10547 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10550 + .species = SPECIES_NUMEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10552 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10551 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10554 + [TRAINER_MARC] = + { +#line 10555 + .trainerName = _("MARC"), +#line 10556 + .trainerClass = TRAINER_CLASS_HIKER, +#line 10557 + .trainerPic = TRAINER_PIC_HIKER, + .encounterMusic_gender = +#line 10559 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 10560 + .doubleBattle = FALSE, +#line 10561 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10563 + .species = SPECIES_GEODUDE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10565 + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), +#line 10564 + .lvl = 8, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10567 + .species = SPECIES_GEODUDE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10569 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 10568 + .lvl = 8, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10571 + [TRAINER_BRENDEN] = + { +#line 10572 + .trainerName = _("BRENDEN"), +#line 10573 + .trainerClass = TRAINER_CLASS_SAILOR, +#line 10574 + .trainerPic = TRAINER_PIC_SAILOR, + .encounterMusic_gender = +#line 10576 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 10577 + .doubleBattle = FALSE, +#line 10578 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10655 - .species = SPECIES_SPOINK, +#line 10580 + .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10657 +#line 10582 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10656 +#line 10581 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10584 + [TRAINER_LILITH] = + { +#line 10585 + .trainerName = _("LILITH"), +#line 10586 + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, +#line 10587 + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .encounterMusic_gender = +#line 10588 +F_TRAINER_FEMALE | +#line 10589 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 10590 + .doubleBattle = FALSE, +#line 10591 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10593 + .species = SPECIES_MEDITITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10595 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 10594 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10597 + [TRAINER_CRISTIAN] = + { +#line 10598 + .trainerName = _("CRISTIAN"), +#line 10599 + .trainerClass = TRAINER_CLASS_BLACK_BELT, +#line 10600 + .trainerPic = TRAINER_PIC_BLACK_BELT, + .encounterMusic_gender = +#line 10602 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 10603 + .doubleBattle = FALSE, +#line 10604 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10606 + .species = SPECIES_MAKUHITA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10608 + .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), +#line 10607 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10610 + [TRAINER_SYLVIA] = + { +#line 10611 + .trainerName = _("SYLVIA"), +#line 10612 + .trainerClass = TRAINER_CLASS_HEX_MANIAC, +#line 10613 + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .encounterMusic_gender = +#line 10614 +F_TRAINER_FEMALE | +#line 10615 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 10616 + .doubleBattle = FALSE, +#line 10617 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10619 + .species = SPECIES_MEDITITE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10621 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 10620 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, +#line 10623 + [TRAINER_LEONARDO] = + { +#line 10624 + .trainerName = _("LEONARDO"), +#line 10625 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 10626 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 10628 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 10629 + .doubleBattle = FALSE, +#line 10630 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10632 + .species = SPECIES_CARVANHA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10634 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10633 + .lvl = 34, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10636 + [TRAINER_ATHENA] = + { +#line 10637 + .trainerName = _("ATHENA"), +#line 10638 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 10639 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 10640 +F_TRAINER_FEMALE | +#line 10641 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 10642 + .items = { ITEM_HYPER_POTION }, +#line 10643 + .doubleBattle = FALSE, +#line 10644 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10646 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10648 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 10647 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 10649 + MOVE_THUNDER, + MOVE_THUNDER_WAVE, + MOVE_QUICK_ATTACK, + }, + }, + { +#line 10653 + .species = SPECIES_LINOONE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10655 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 10654 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 10656 + MOVE_SURF, + MOVE_THIEF, + }, + }, + }, + }, #line 10659 - [TRAINER_KATHLEEN] = + [TRAINER_HARRISON] = { #line 10660 - .trainerName = _("KATHLEEN"), + .trainerName = _("HARRISON"), #line 10661 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 10662 - .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 10663 -F_TRAINER_FEMALE | #line 10664 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10665 .doubleBattle = FALSE, #line 10666 @@ -26900,29 +26736,29 @@ F_TRAINER_FEMALE | { { #line 10668 - .species = SPECIES_KADABRA, + .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, #line 10670 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 10669 - .lvl = 36, + .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 10672 - [TRAINER_CLIFFORD] = + [TRAINER_GRUNT_MT_CHIMNEY_2] = { #line 10673 - .trainerName = _("CLIFFORD"), + .trainerName = _("GRUNT"), #line 10674 - .trainerClass = TRAINER_CLASS_GENTLEMAN, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10675 - .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = #line 10677 - TRAINER_ENCOUNTER_MUSIC_RICH, + TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10678 .doubleBattle = FALSE, #line 10679 @@ -26932,29 +26768,29 @@ F_TRAINER_FEMALE | { { #line 10681 - .species = SPECIES_GIRAFARIG, + .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, #line 10683 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 10682 - .lvl = 36, + .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 10685 - [TRAINER_NICHOLAS] = + [TRAINER_CLARENCE] = { #line 10686 - .trainerName = _("NICHOLAS"), + .trainerName = _("CLARENCE"), #line 10687 - .trainerClass = TRAINER_CLASS_PSYCHIC, + .trainerClass = TRAINER_CLASS_SWIMMER_M, #line 10688 - .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = #line 10690 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10691 .doubleBattle = FALSE, #line 10692 @@ -26964,2872 +26800,3036 @@ F_TRAINER_FEMALE | { { #line 10694 - .species = SPECIES_WOBBUFFET, + .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, #line 10696 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 10695 - .lvl = 36, + .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 10698 - [TRAINER_GRUNT_SPACE_CENTER_3] = + [TRAINER_TERRY] = { #line 10699 - .trainerName = _("GRUNT"), + .trainerName = _("TERRY"), #line 10700 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .trainerClass = TRAINER_CLASS_PSYCHIC, #line 10701 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = #line 10702 F_TRAINER_FEMALE | #line 10703 - TRAINER_ENCOUNTER_MUSIC_MAGMA, + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10704 .doubleBattle = FALSE, #line 10705 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10707 + .species = SPECIES_GIRAFARIG, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10709 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10708 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10711 + [TRAINER_NATE] = + { +#line 10712 + .trainerName = _("NATE"), +#line 10713 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 10714 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 10716 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 10717 + .doubleBattle = FALSE, +#line 10718 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10720 + .species = SPECIES_SPOINK, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10722 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 10721 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10724 + [TRAINER_KATHLEEN] = + { +#line 10725 + .trainerName = _("KATHLEEN"), +#line 10726 + .trainerClass = TRAINER_CLASS_HEX_MANIAC, +#line 10727 + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .encounterMusic_gender = +#line 10728 +F_TRAINER_FEMALE | +#line 10729 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 10730 + .doubleBattle = FALSE, +#line 10731 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10733 + .species = SPECIES_KADABRA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10735 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 10734 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10737 + [TRAINER_CLIFFORD] = + { +#line 10738 + .trainerName = _("CLIFFORD"), +#line 10739 + .trainerClass = TRAINER_CLASS_GENTLEMAN, +#line 10740 + .trainerPic = TRAINER_PIC_GENTLEMAN, + .encounterMusic_gender = +#line 10742 + TRAINER_ENCOUNTER_MUSIC_RICH, +#line 10743 + .doubleBattle = FALSE, +#line 10744 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10746 + .species = SPECIES_GIRAFARIG, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10748 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10747 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10750 + [TRAINER_NICHOLAS] = + { +#line 10751 + .trainerName = _("NICHOLAS"), +#line 10752 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 10753 + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .encounterMusic_gender = +#line 10755 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 10756 + .doubleBattle = FALSE, +#line 10757 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10759 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10761 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10760 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10763 + [TRAINER_GRUNT_SPACE_CENTER_3] = + { +#line 10764 + .trainerName = _("GRUNT"), +#line 10765 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 10766 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .encounterMusic_gender = +#line 10767 +F_TRAINER_FEMALE | +#line 10768 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 10769 + .doubleBattle = FALSE, +#line 10770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10707 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10709 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10708 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10711 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10713 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10712 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10715 - [TRAINER_GRUNT_SPACE_CENTER_4] = - { -#line 10716 - .trainerName = _("GRUNT"), -#line 10717 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10718 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10720 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10721 - .doubleBattle = FALSE, -#line 10722 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10724 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10726 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10725 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10728 - [TRAINER_GRUNT_SPACE_CENTER_5] = - { -#line 10729 - .trainerName = _("GRUNT"), -#line 10730 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10731 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10733 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10734 - .doubleBattle = FALSE, -#line 10735 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10737 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10739 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10738 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10741 - [TRAINER_GRUNT_SPACE_CENTER_6] = - { -#line 10742 - .trainerName = _("GRUNT"), -#line 10743 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10744 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10746 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10747 - .doubleBattle = FALSE, -#line 10748 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10750 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10752 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10751 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10754 - [TRAINER_GRUNT_SPACE_CENTER_7] = - { -#line 10755 - .trainerName = _("GRUNT"), -#line 10756 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10757 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10759 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10760 - .doubleBattle = FALSE, -#line 10761 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10763 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10765 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10764 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10767 - [TRAINER_MACEY] = - { -#line 10768 - .trainerName = _("MACEY"), -#line 10769 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10770 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10771 -F_TRAINER_FEMALE | #line 10772 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10773 - .doubleBattle = FALSE, + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, #line 10774 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10773 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 10776 - .species = SPECIES_NATU, + .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 10778 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 10777 - .lvl = 36, + .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 10780 - [TRAINER_BRENDAN_RUSTBORO_TREECKO] = + [TRAINER_GRUNT_SPACE_CENTER_4] = { #line 10781 - .trainerName = _("BRENDAN"), + .trainerName = _("GRUNT"), #line 10782 - .trainerClass = TRAINER_CLASS_RIVAL, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 10783 - .trainerPic = TRAINER_PIC_BRENDAN, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = #line 10785 - TRAINER_ENCOUNTER_MUSIC_MALE, + TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10786 .doubleBattle = FALSE, #line 10787 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10789 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10791 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10790 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10793 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10795 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10794 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10797 - [TRAINER_BRENDAN_RUSTBORO_MUDKIP] = - { -#line 10798 - .trainerName = _("BRENDAN"), -#line 10799 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10800 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10802 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10803 - .doubleBattle = FALSE, -#line 10804 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10806 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10808 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10807 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10810 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10812 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10811 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10814 - [TRAINER_PAXTON] = - { -#line 10815 - .trainerName = _("PAXTON"), -#line 10816 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 10817 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 10819 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10820 - .doubleBattle = FALSE, -#line 10821 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10823 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10825 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10824 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10827 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10829 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10828 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10831 - [TRAINER_ISABELLA] = - { -#line 10832 - .trainerName = _("ISABELLA"), -#line 10833 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10834 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 10835 -F_TRAINER_FEMALE | -#line 10836 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10837 - .doubleBattle = FALSE, -#line 10838 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 10840 +#line 10789 + .species = SPECIES_BALTOY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10791 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10790 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10793 + [TRAINER_GRUNT_SPACE_CENTER_5] = + { +#line 10794 + .trainerName = _("GRUNT"), +#line 10795 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 10796 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .encounterMusic_gender = +#line 10798 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 10799 + .doubleBattle = FALSE, +#line 10800 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10802 + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10804 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10803 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10806 + [TRAINER_GRUNT_SPACE_CENTER_6] = + { +#line 10807 + .trainerName = _("GRUNT"), +#line 10808 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 10809 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .encounterMusic_gender = +#line 10811 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 10812 + .doubleBattle = FALSE, +#line 10813 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10815 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10817 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10816 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10819 + [TRAINER_GRUNT_SPACE_CENTER_7] = + { +#line 10820 + .trainerName = _("GRUNT"), +#line 10821 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 10822 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .encounterMusic_gender = +#line 10824 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 10825 + .doubleBattle = FALSE, +#line 10826 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10828 + .species = SPECIES_BALTOY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10830 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10829 + .lvl = 32, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10832 + [TRAINER_MACEY] = + { +#line 10833 + .trainerName = _("MACEY"), +#line 10834 + .trainerClass = TRAINER_CLASS_PSYCHIC, +#line 10835 + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .encounterMusic_gender = +#line 10836 +F_TRAINER_FEMALE | +#line 10837 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 10838 + .doubleBattle = FALSE, +#line 10839 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10841 + .species = SPECIES_NATU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10843 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10842 + .lvl = 36, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10845 + [TRAINER_BRENDAN_RUSTBORO_TREECKO] = + { +#line 10846 + .trainerName = _("BRENDAN"), +#line 10847 + .trainerClass = TRAINER_CLASS_RIVAL, +#line 10848 + .trainerPic = TRAINER_PIC_BRENDAN, + .encounterMusic_gender = +#line 10850 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 10851 + .doubleBattle = FALSE, +#line 10852 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10854 + .species = SPECIES_LOTAD, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10856 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 10855 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10858 + .species = SPECIES_TORCHIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10860 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10859 + .lvl = 15, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10862 + [TRAINER_BRENDAN_RUSTBORO_MUDKIP] = + { +#line 10863 + .trainerName = _("BRENDAN"), +#line 10864 + .trainerClass = TRAINER_CLASS_RIVAL, +#line 10865 + .trainerPic = TRAINER_PIC_BRENDAN, + .encounterMusic_gender = +#line 10867 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 10868 + .doubleBattle = FALSE, +#line 10869 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10871 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10873 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 10872 + .lvl = 13, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10875 + .species = SPECIES_TREECKO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10877 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 10876 + .lvl = 15, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10879 + [TRAINER_PAXTON] = + { +#line 10880 + .trainerName = _("PAXTON"), +#line 10881 + .trainerClass = TRAINER_CLASS_EXPERT, +#line 10882 + .trainerPic = TRAINER_PIC_EXPERT_M, + .encounterMusic_gender = +#line 10884 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 10885 + .doubleBattle = FALSE, +#line 10886 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 10888 + .species = SPECIES_SWELLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10890 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10889 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 10892 + .species = SPECIES_BRELOOM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 10894 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 10893 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 10896 + [TRAINER_ISABELLA] = + { +#line 10897 + .trainerName = _("ISABELLA"), +#line 10898 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 10899 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .encounterMusic_gender = +#line 10900 +F_TRAINER_FEMALE | +#line 10901 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 10902 + .doubleBattle = FALSE, +#line 10903 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 10905 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10842 +#line 10907 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10841 +#line 10906 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10844 +#line 10909 [TRAINER_GRUNT_WEATHER_INST_5] = { -#line 10845 +#line 10910 .trainerName = _("GRUNT"), -#line 10846 +#line 10911 .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10847 +#line 10912 .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, .encounterMusic_gender = -#line 10848 +#line 10913 F_TRAINER_FEMALE | -#line 10849 +#line 10914 TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10850 +#line 10915 .doubleBattle = FALSE, -#line 10851 +#line 10916 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10853 +#line 10918 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10855 +#line 10920 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10854 +#line 10919 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10857 +#line 10922 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10859 +#line 10924 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10858 +#line 10923 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10861 +#line 10926 [TRAINER_TABITHA_MT_CHIMNEY] = { -#line 10862 +#line 10927 .trainerName = _("TABITHA"), -#line 10863 +#line 10928 .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 10864 +#line 10929 .trainerPic = TRAINER_PIC_MAGMA_ADMIN, .encounterMusic_gender = -#line 10866 +#line 10931 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10867 +#line 10932 .doubleBattle = FALSE, -#line 10868 +#line 10933 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 10870 +#line 10935 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10872 +#line 10937 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10871 +#line 10936 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10874 +#line 10939 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10876 +#line 10941 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10875 +#line 10940 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10878 +#line 10943 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10880 +#line 10945 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10879 +#line 10944 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10882 +#line 10947 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10884 +#line 10949 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10883 +#line 10948 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10886 +#line 10951 [TRAINER_JONATHAN] = { -#line 10887 +#line 10952 .trainerName = _("JONATHAN"), -#line 10888 +#line 10953 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10889 +#line 10954 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 10891 +#line 10956 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10892 +#line 10957 .items = { ITEM_HYPER_POTION }, -#line 10893 +#line 10958 .doubleBattle = FALSE, -#line 10894 +#line 10959 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10896 +#line 10961 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10898 +#line 10963 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10897 +#line 10962 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10900 +#line 10965 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10902 +#line 10967 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10901 +#line 10966 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10904 +#line 10969 [TRAINER_BRENDAN_RUSTBORO_TORCHIC] = { -#line 10905 +#line 10970 .trainerName = _("BRENDAN"), -#line 10906 +#line 10971 .trainerClass = TRAINER_CLASS_RIVAL, -#line 10907 +#line 10972 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 10909 +#line 10974 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10910 +#line 10975 .doubleBattle = FALSE, -#line 10911 +#line 10976 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10913 +#line 10978 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10915 +#line 10980 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10914 +#line 10979 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10917 +#line 10982 .species = SPECIES_MUDKIP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10919 +#line 10984 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10918 +#line 10983 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10921 +#line 10986 [TRAINER_MAY_RUSTBORO_MUDKIP] = { -#line 10922 +#line 10987 .trainerName = _("MAY"), -#line 10923 +#line 10988 .trainerClass = TRAINER_CLASS_RIVAL, -#line 10924 +#line 10989 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 10925 +#line 10990 F_TRAINER_FEMALE | -#line 10926 +#line 10991 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10927 +#line 10992 .doubleBattle = FALSE, -#line 10928 +#line 10993 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10930 +#line 10995 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10932 +#line 10997 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10931 +#line 10996 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10934 +#line 10999 .species = SPECIES_TREECKO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10936 +#line 11001 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10935 +#line 11000 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10938 +#line 11003 [TRAINER_MAXIE_MAGMA_HIDEOUT] = { -#line 10939 +#line 11004 .trainerName = _("MAXIE"), -#line 10940 +#line 11005 .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 10941 +#line 11006 .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, .encounterMusic_gender = -#line 10943 +#line 11008 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10944 +#line 11009 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 10945 +#line 11010 .doubleBattle = FALSE, -#line 10946 +#line 11011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 10948 +#line 11013 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10950 +#line 11015 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10949 +#line 11014 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10952 +#line 11017 .species = SPECIES_CROBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10954 +#line 11019 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10953 +#line 11018 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10956 +#line 11021 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10958 +#line 11023 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10957 +#line 11022 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10960 +#line 11025 [TRAINER_MAXIE_MT_CHIMNEY] = { -#line 10961 +#line 11026 .trainerName = _("MAXIE"), -#line 10962 +#line 11027 .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 10963 +#line 11028 .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, .encounterMusic_gender = -#line 10965 +#line 11030 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10966 +#line 11031 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 10967 +#line 11032 .doubleBattle = FALSE, -#line 10968 +#line 11033 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 10970 +#line 11035 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10972 +#line 11037 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10971 +#line 11036 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10974 +#line 11039 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10976 +#line 11041 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10975 +#line 11040 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10978 +#line 11043 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10980 +#line 11045 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10979 +#line 11044 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10982 +#line 11047 [TRAINER_TIANA] = { -#line 10983 +#line 11048 .trainerName = _("TIANA"), -#line 10984 +#line 11049 .trainerClass = TRAINER_CLASS_LASS, -#line 10985 +#line 11050 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 10986 +#line 11051 F_TRAINER_FEMALE | -#line 10987 +#line 11052 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10988 +#line 11053 .doubleBattle = FALSE, -#line 10989 +#line 11054 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 10991 +#line 11056 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10993 +#line 11058 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10992 +#line 11057 .lvl = 4, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 10995 +#line 11060 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 10997 +#line 11062 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10996 +#line 11061 .lvl = 4, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 10999 +#line 11064 [TRAINER_HALEY_1] = { -#line 11000 +#line 11065 .trainerName = _("HALEY"), -#line 11001 +#line 11066 .trainerClass = TRAINER_CLASS_LASS, -#line 11002 +#line 11067 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11003 +#line 11068 F_TRAINER_FEMALE | -#line 11004 +#line 11069 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11005 +#line 11070 .doubleBattle = FALSE, -#line 11006 +#line 11071 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11008 +#line 11073 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11010 +#line 11075 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11009 +#line 11074 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11012 +#line 11077 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11014 +#line 11079 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11013 +#line 11078 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11016 +#line 11081 [TRAINER_JANICE] = { -#line 11017 +#line 11082 .trainerName = _("JANICE"), -#line 11018 +#line 11083 .trainerClass = TRAINER_CLASS_LASS, -#line 11019 +#line 11084 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11020 +#line 11085 F_TRAINER_FEMALE | -#line 11021 +#line 11086 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11022 +#line 11087 .doubleBattle = FALSE, -#line 11023 +#line 11088 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11025 +#line 11090 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11027 +#line 11092 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11026 +#line 11091 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11029 +#line 11094 [TRAINER_VIVI] = { -#line 11030 +#line 11095 .trainerName = _("VIVI"), -#line 11031 +#line 11096 .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 11032 +#line 11097 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11033 +#line 11098 F_TRAINER_FEMALE | -#line 11034 +#line 11099 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11035 +#line 11100 .doubleBattle = FALSE, -#line 11036 +#line 11101 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11038 +#line 11103 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11040 +#line 11105 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11039 +#line 11104 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11042 +#line 11107 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11044 +#line 11109 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11043 +#line 11108 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11046 +#line 11111 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11048 +#line 11113 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11047 +#line 11112 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11050 +#line 11115 [TRAINER_HALEY_2] = { -#line 11051 +#line 11116 .trainerName = _("HALEY"), -#line 11052 +#line 11117 .trainerClass = TRAINER_CLASS_LASS, -#line 11053 +#line 11118 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11054 +#line 11119 F_TRAINER_FEMALE | -#line 11055 +#line 11120 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11056 +#line 11121 .doubleBattle = FALSE, -#line 11057 +#line 11122 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11059 +#line 11124 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11061 +#line 11126 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11060 +#line 11125 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11063 +#line 11128 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11065 +#line 11130 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11064 +#line 11129 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11067 +#line 11132 [TRAINER_HALEY_3] = { -#line 11068 +#line 11133 .trainerName = _("HALEY"), -#line 11069 +#line 11134 .trainerClass = TRAINER_CLASS_LASS, -#line 11070 +#line 11135 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11071 +#line 11136 F_TRAINER_FEMALE | -#line 11072 +#line 11137 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11073 +#line 11138 .doubleBattle = FALSE, -#line 11074 +#line 11139 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11076 +#line 11141 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11078 +#line 11143 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11077 +#line 11142 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11080 +#line 11145 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11082 +#line 11147 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11081 +#line 11146 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11084 +#line 11149 [TRAINER_HALEY_4] = { -#line 11085 +#line 11150 .trainerName = _("HALEY"), -#line 11086 +#line 11151 .trainerClass = TRAINER_CLASS_LASS, -#line 11087 +#line 11152 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11088 +#line 11153 F_TRAINER_FEMALE | -#line 11089 +#line 11154 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11090 +#line 11155 .doubleBattle = FALSE, -#line 11091 +#line 11156 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11093 +#line 11158 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11095 +#line 11160 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11094 +#line 11159 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11097 +#line 11162 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11099 +#line 11164 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11098 +#line 11163 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11101 +#line 11166 [TRAINER_HALEY_5] = { -#line 11102 +#line 11167 .trainerName = _("HALEY"), -#line 11103 +#line 11168 .trainerClass = TRAINER_CLASS_LASS, -#line 11104 +#line 11169 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11105 +#line 11170 F_TRAINER_FEMALE | -#line 11106 +#line 11171 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11107 +#line 11172 .doubleBattle = FALSE, -#line 11108 +#line 11173 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11110 +#line 11175 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11112 +#line 11177 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11111 +#line 11176 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11114 +#line 11179 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11116 +#line 11181 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11115 +#line 11180 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11118 +#line 11183 .species = SPECIES_BRELOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11120 +#line 11185 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11119 +#line 11184 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11122 +#line 11187 [TRAINER_SALLY] = { -#line 11123 +#line 11188 .trainerName = _("SALLY"), -#line 11124 +#line 11189 .trainerClass = TRAINER_CLASS_LASS, -#line 11125 +#line 11190 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11126 +#line 11191 F_TRAINER_FEMALE | -#line 11127 +#line 11192 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11128 +#line 11193 .doubleBattle = FALSE, -#line 11129 +#line 11194 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11131 +#line 11196 .species = SPECIES_ODDISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11133 +#line 11198 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11132 +#line 11197 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11135 +#line 11200 [TRAINER_ROBIN] = { -#line 11136 +#line 11201 .trainerName = _("ROBIN"), -#line 11137 +#line 11202 .trainerClass = TRAINER_CLASS_LASS, -#line 11138 +#line 11203 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11139 +#line 11204 F_TRAINER_FEMALE | -#line 11140 +#line 11205 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11141 +#line 11206 .doubleBattle = FALSE, -#line 11142 +#line 11207 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11144 +#line 11209 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11146 +#line 11211 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11145 +#line 11210 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11148 +#line 11213 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11150 +#line 11215 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11149 +#line 11214 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11152 +#line 11217 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11154 +#line 11219 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11153 +#line 11218 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11156 +#line 11221 [TRAINER_ANDREA] = { -#line 11157 +#line 11222 .trainerName = _("ANDREA"), -#line 11158 +#line 11223 .trainerClass = TRAINER_CLASS_LASS, -#line 11159 +#line 11224 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11160 +#line 11225 F_TRAINER_FEMALE | -#line 11161 +#line 11226 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11162 +#line 11227 .doubleBattle = FALSE, -#line 11163 +#line 11228 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11165 +#line 11230 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11167 +#line 11232 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11166 +#line 11231 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11169 +#line 11234 [TRAINER_CRISSY] = { -#line 11170 +#line 11235 .trainerName = _("CRISSY"), -#line 11171 +#line 11236 .trainerClass = TRAINER_CLASS_LASS, -#line 11172 +#line 11237 .trainerPic = TRAINER_PIC_LASS, .encounterMusic_gender = -#line 11173 +#line 11238 F_TRAINER_FEMALE | -#line 11174 +#line 11239 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11175 +#line 11240 .doubleBattle = FALSE, -#line 11176 +#line 11241 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11178 +#line 11243 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11180 +#line 11245 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11179 +#line 11244 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11182 +#line 11247 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11184 +#line 11249 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11183 +#line 11248 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11186 +#line 11251 [TRAINER_RICK] = { -#line 11187 +#line 11252 .trainerName = _("RICK"), -#line 11188 +#line 11253 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11189 +#line 11254 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11191 +#line 11256 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11192 +#line 11257 .doubleBattle = FALSE, -#line 11193 +#line 11258 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11195 +#line 11260 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11197 +#line 11262 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11196 +#line 11261 .lvl = 4, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11199 +#line 11264 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11201 +#line 11266 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11200 +#line 11265 .lvl = 4, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11203 +#line 11268 [TRAINER_LYLE] = { -#line 11204 +#line 11269 .trainerName = _("LYLE"), -#line 11205 +#line 11270 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11206 +#line 11271 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11208 +#line 11273 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11209 +#line 11274 .doubleBattle = FALSE, -#line 11210 +#line 11275 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11212 +#line 11277 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11214 +#line 11279 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11213 +#line 11278 .lvl = 3, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11216 +#line 11281 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11218 +#line 11283 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11217 +#line 11282 .lvl = 3, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11220 +#line 11285 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11222 +#line 11287 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11221 +#line 11286 .lvl = 3, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11224 +#line 11289 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11226 +#line 11291 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11225 +#line 11290 .lvl = 3, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11228 +#line 11293 [TRAINER_JOSE] = { -#line 11229 +#line 11294 .trainerName = _("JOSE"), -#line 11230 +#line 11295 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11231 +#line 11296 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11233 +#line 11298 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11234 +#line 11299 .doubleBattle = FALSE, -#line 11235 +#line 11300 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11237 +#line 11302 .species = SPECIES_WURMPLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11239 +#line 11304 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11238 +#line 11303 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11241 +#line 11306 .species = SPECIES_NINCADA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11243 +#line 11308 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11242 +#line 11307 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11245 +#line 11310 [TRAINER_DOUG] = { -#line 11246 +#line 11311 .trainerName = _("DOUG"), -#line 11247 +#line 11312 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11248 +#line 11313 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11250 +#line 11315 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11251 +#line 11316 .doubleBattle = FALSE, -#line 11252 +#line 11317 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11254 +#line 11319 .species = SPECIES_NINCADA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11256 +#line 11321 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11255 +#line 11320 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11258 +#line 11323 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11260 +#line 11325 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11259 +#line 11324 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11262 +#line 11327 [TRAINER_GREG] = { -#line 11263 +#line 11328 .trainerName = _("GREG"), -#line 11264 +#line 11329 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11265 +#line 11330 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11267 +#line 11332 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11268 +#line 11333 .doubleBattle = FALSE, -#line 11269 +#line 11334 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11271 +#line 11336 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11273 +#line 11338 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11272 +#line 11337 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11275 +#line 11340 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11277 +#line 11342 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11276 +#line 11341 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11279 +#line 11344 [TRAINER_KENT] = { -#line 11280 +#line 11345 .trainerName = _("KENT"), -#line 11281 +#line 11346 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11282 +#line 11347 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11284 +#line 11349 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11285 +#line 11350 .doubleBattle = FALSE, -#line 11286 +#line 11351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11288 +#line 11353 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11290 +#line 11355 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11289 +#line 11354 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11292 +#line 11357 [TRAINER_JAMES_1] = { -#line 11293 +#line 11358 .trainerName = _("JAMES"), -#line 11294 +#line 11359 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11295 +#line 11360 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11297 +#line 11362 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11298 +#line 11363 .doubleBattle = FALSE, -#line 11299 +#line 11364 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11301 +#line 11366 .species = SPECIES_NINCADA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11303 +#line 11368 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11302 +#line 11367 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11305 +#line 11370 .species = SPECIES_NINCADA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11307 +#line 11372 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11306 +#line 11371 .lvl = 6, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11309 +#line 11374 [TRAINER_JAMES_2] = { -#line 11310 +#line 11375 .trainerName = _("JAMES"), -#line 11311 +#line 11376 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11312 +#line 11377 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11314 +#line 11379 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11315 +#line 11380 .doubleBattle = FALSE, -#line 11316 +#line 11381 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11318 +#line 11383 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11320 +#line 11385 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11319 +#line 11384 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11322 +#line 11387 [TRAINER_JAMES_3] = { -#line 11323 +#line 11388 .trainerName = _("JAMES"), -#line 11324 +#line 11389 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11325 +#line 11390 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11327 +#line 11392 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11328 +#line 11393 .doubleBattle = FALSE, -#line 11329 +#line 11394 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11331 +#line 11396 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11333 +#line 11398 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11332 +#line 11397 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11335 +#line 11400 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11337 +#line 11402 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11336 +#line 11401 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11339 +#line 11404 [TRAINER_JAMES_4] = { -#line 11340 +#line 11405 .trainerName = _("JAMES"), -#line 11341 +#line 11406 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11342 +#line 11407 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11344 +#line 11409 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11345 +#line 11410 .doubleBattle = FALSE, -#line 11346 +#line 11411 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11348 +#line 11413 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11350 +#line 11415 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11349 +#line 11414 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11352 +#line 11417 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11354 +#line 11419 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11353 +#line 11418 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11356 +#line 11421 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11358 +#line 11423 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11357 +#line 11422 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11360 +#line 11425 [TRAINER_JAMES_5] = { -#line 11361 +#line 11426 .trainerName = _("JAMES"), -#line 11362 +#line 11427 .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11363 +#line 11428 .trainerPic = TRAINER_PIC_BUG_CATCHER, .encounterMusic_gender = -#line 11365 +#line 11430 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11366 +#line 11431 .doubleBattle = FALSE, -#line 11367 +#line 11432 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11369 +#line 11434 .species = SPECIES_SURSKIT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11371 +#line 11436 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11370 +#line 11435 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11373 +#line 11438 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11375 +#line 11440 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11374 +#line 11439 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11377 +#line 11442 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11379 +#line 11444 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11378 +#line 11443 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11381 +#line 11446 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11383 +#line 11448 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11382 +#line 11447 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11385 +#line 11450 [TRAINER_BRICE] = { -#line 11386 +#line 11451 .trainerName = _("BRICE"), -#line 11387 +#line 11452 .trainerClass = TRAINER_CLASS_HIKER, -#line 11388 +#line 11453 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11390 +#line 11455 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11391 +#line 11456 .doubleBattle = FALSE, -#line 11392 +#line 11457 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11394 +#line 11459 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11396 +#line 11461 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11395 +#line 11460 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11398 +#line 11463 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11400 +#line 11465 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11399 +#line 11464 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11402 +#line 11467 [TRAINER_TRENT_1] = { -#line 11403 +#line 11468 .trainerName = _("TRENT"), -#line 11404 +#line 11469 .trainerClass = TRAINER_CLASS_HIKER, -#line 11405 +#line 11470 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11407 +#line 11472 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11408 +#line 11473 .doubleBattle = FALSE, -#line 11409 +#line 11474 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11411 +#line 11476 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11413 +#line 11478 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11412 +#line 11477 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11415 +#line 11480 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11417 +#line 11482 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11416 +#line 11481 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11419 +#line 11484 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11421 +#line 11486 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11420 +#line 11485 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11423 +#line 11488 [TRAINER_LENNY] = { -#line 11424 +#line 11489 .trainerName = _("LENNY"), -#line 11425 +#line 11490 .trainerClass = TRAINER_CLASS_HIKER, -#line 11426 +#line 11491 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11428 +#line 11493 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11429 +#line 11494 .doubleBattle = FALSE, -#line 11430 +#line 11495 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11432 +#line 11497 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11434 +#line 11499 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11433 +#line 11498 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11436 +#line 11501 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11438 +#line 11503 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11437 +#line 11502 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11440 +#line 11505 [TRAINER_LUCAS_1] = { -#line 11441 +#line 11506 .trainerName = _("LUCAS"), -#line 11442 +#line 11507 .trainerClass = TRAINER_CLASS_HIKER, -#line 11443 +#line 11508 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11445 +#line 11510 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11446 +#line 11511 .doubleBattle = FALSE, -#line 11447 +#line 11512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11449 +#line 11514 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11451 +#line 11516 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11450 +#line 11515 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11453 +#line 11518 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11455 +#line 11520 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11454 +#line 11519 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11457 +#line 11522 [TRAINER_ALAN] = { -#line 11458 +#line 11523 .trainerName = _("ALAN"), -#line 11459 +#line 11524 .trainerClass = TRAINER_CLASS_HIKER, -#line 11460 +#line 11525 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11462 +#line 11527 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11463 +#line 11528 .doubleBattle = FALSE, -#line 11464 +#line 11529 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11466 +#line 11531 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11468 +#line 11533 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11467 +#line 11532 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11470 +#line 11535 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11472 +#line 11537 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11471 +#line 11536 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11474 +#line 11539 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11476 +#line 11541 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11475 +#line 11540 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11478 +#line 11543 [TRAINER_CLARK] = { -#line 11479 +#line 11544 .trainerName = _("CLARK"), -#line 11480 +#line 11545 .trainerClass = TRAINER_CLASS_HIKER, -#line 11481 +#line 11546 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11483 +#line 11548 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11484 +#line 11549 .doubleBattle = FALSE, -#line 11485 +#line 11550 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11487 +#line 11552 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11489 +#line 11554 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11488 +#line 11553 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11491 +#line 11556 [TRAINER_ERIC] = { -#line 11492 +#line 11557 .trainerName = _("ERIC"), -#line 11493 +#line 11558 .trainerClass = TRAINER_CLASS_HIKER, -#line 11494 +#line 11559 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11496 +#line 11561 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11497 +#line 11562 .doubleBattle = FALSE, -#line 11498 +#line 11563 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11500 +#line 11565 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11502 +#line 11567 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11501 +#line 11566 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11504 +#line 11569 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11506 +#line 11571 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11505 +#line 11570 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11508 +#line 11573 [TRAINER_LUCAS_2] = { -#line 11509 +#line 11574 .trainerName = _("LUCAS"), -#line 11510 +#line 11575 .trainerClass = TRAINER_CLASS_HIKER, -#line 11511 +#line 11576 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11513 +#line 11578 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11514 +#line 11579 .doubleBattle = FALSE, -#line 11515 +#line 11580 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11517 +#line 11582 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11519 +#line 11584 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11518 +#line 11583 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11520 +#line 11585 MOVE_SPLASH, MOVE_WATER_GUN, }, }, }, }, -#line 11523 +#line 11588 [TRAINER_MIKE_1] = { -#line 11524 +#line 11589 .trainerName = _("MIKE"), -#line 11525 +#line 11590 .trainerClass = TRAINER_CLASS_HIKER, -#line 11526 +#line 11591 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11528 +#line 11593 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11529 +#line 11594 .doubleBattle = FALSE, -#line 11530 +#line 11595 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11532 +#line 11597 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11534 +#line 11599 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11533 +#line 11598 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11535 +#line 11600 MOVE_GUST, MOVE_GROWL, }, }, { -#line 11538 +#line 11603 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11540 +#line 11605 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11539 +#line 11604 .lvl = 10, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11541 +#line 11606 MOVE_BITE, MOVE_SCARY_FACE, }, }, }, }, -#line 11544 +#line 11609 [TRAINER_MIKE_2] = { -#line 11545 +#line 11610 .trainerName = _("MIKE"), -#line 11546 +#line 11611 .trainerClass = TRAINER_CLASS_HIKER, -#line 11547 +#line 11612 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11549 +#line 11614 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11550 +#line 11615 .doubleBattle = FALSE, -#line 11551 +#line 11616 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11553 +#line 11618 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11555 +#line 11620 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11554 +#line 11619 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11557 +#line 11622 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11559 +#line 11624 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11558 +#line 11623 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11561 +#line 11626 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11563 +#line 11628 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11562 +#line 11627 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11565 +#line 11630 [TRAINER_TRENT_2] = { -#line 11566 +#line 11631 .trainerName = _("TRENT"), -#line 11567 +#line 11632 .trainerClass = TRAINER_CLASS_HIKER, -#line 11568 +#line 11633 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11570 +#line 11635 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11571 +#line 11636 .doubleBattle = FALSE, -#line 11572 +#line 11637 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11574 +#line 11639 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11576 +#line 11641 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11575 +#line 11640 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11578 +#line 11643 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11580 +#line 11645 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11579 +#line 11644 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11582 +#line 11647 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11584 +#line 11649 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11583 +#line 11648 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11586 +#line 11651 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11588 +#line 11653 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11587 +#line 11652 .lvl = 24, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11590 +#line 11655 [TRAINER_TRENT_3] = { -#line 11591 +#line 11656 .trainerName = _("TRENT"), -#line 11592 +#line 11657 .trainerClass = TRAINER_CLASS_HIKER, -#line 11593 +#line 11658 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11595 +#line 11660 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11596 +#line 11661 .doubleBattle = FALSE, -#line 11597 +#line 11662 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11599 +#line 11664 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11601 +#line 11666 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11600 +#line 11665 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11603 +#line 11668 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11605 +#line 11670 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11604 +#line 11669 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11607 +#line 11672 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11609 +#line 11674 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11608 +#line 11673 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11611 +#line 11676 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11613 +#line 11678 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11612 +#line 11677 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11615 +#line 11680 [TRAINER_TRENT_4] = { -#line 11616 +#line 11681 .trainerName = _("TRENT"), -#line 11617 +#line 11682 .trainerClass = TRAINER_CLASS_HIKER, -#line 11618 +#line 11683 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11620 +#line 11685 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11621 +#line 11686 .doubleBattle = FALSE, -#line 11622 +#line 11687 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11624 +#line 11689 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11626 +#line 11691 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11625 +#line 11690 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11628 +#line 11693 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11630 +#line 11695 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11629 +#line 11694 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11632 +#line 11697 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11634 +#line 11699 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11633 +#line 11698 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11636 +#line 11701 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11638 +#line 11703 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11637 +#line 11702 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11640 +#line 11705 [TRAINER_TRENT_5] = { -#line 11641 +#line 11706 .trainerName = _("TRENT"), -#line 11642 +#line 11707 .trainerClass = TRAINER_CLASS_HIKER, -#line 11643 +#line 11708 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 11645 +#line 11710 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11646 +#line 11711 .doubleBattle = FALSE, -#line 11647 +#line 11712 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 11649 +#line 11714 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11651 +#line 11716 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11650 +#line 11715 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11653 +#line 11718 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11655 +#line 11720 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11654 +#line 11719 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11657 +#line 11722 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11659 +#line 11724 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11658 +#line 11723 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11661 +#line 11726 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11663 +#line 11728 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11662 +#line 11727 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11665 +#line 11730 [TRAINER_DEZ_AND_LUKE] = { -#line 11666 +#line 11731 .trainerName = _("DEZ & LUKE"), -#line 11667 +#line 11732 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11668 +#line 11733 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11670 +#line 11735 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11671 +#line 11736 .doubleBattle = TRUE, -#line 11672 +#line 11737 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11674 +#line 11739 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11676 +#line 11741 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11675 +#line 11740 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11678 +#line 11743 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11680 +#line 11745 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11679 +#line 11744 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11682 +#line 11747 [TRAINER_LEA_AND_JED] = { -#line 11683 +#line 11748 .trainerName = _("LEA & JED"), -#line 11684 +#line 11749 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11685 +#line 11750 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11687 +#line 11752 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11688 +#line 11753 .doubleBattle = TRUE, -#line 11689 +#line 11754 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11691 +#line 11756 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11693 +#line 11758 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11692 +#line 11757 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11695 +#line 11760 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11697 +#line 11762 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11696 +#line 11761 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11699 +#line 11764 [TRAINER_KIRA_AND_DAN_1] = { -#line 11700 +#line 11765 .trainerName = _("KIRA & DAN"), -#line 11701 +#line 11766 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11702 +#line 11767 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11704 +#line 11769 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11705 +#line 11770 .doubleBattle = TRUE, -#line 11706 +#line 11771 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11708 +#line 11773 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11710 +#line 11775 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11709 +#line 11774 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11712 +#line 11777 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11714 +#line 11779 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11713 +#line 11778 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11716 +#line 11781 [TRAINER_KIRA_AND_DAN_2] = { -#line 11717 +#line 11782 .trainerName = _("KIRA & DAN"), -#line 11718 +#line 11783 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11719 +#line 11784 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11721 +#line 11786 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11722 +#line 11787 .doubleBattle = TRUE, -#line 11723 +#line 11788 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11725 +#line 11790 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11727 +#line 11792 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11726 +#line 11791 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11729 +#line 11794 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11731 +#line 11796 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11730 +#line 11795 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11733 +#line 11798 [TRAINER_KIRA_AND_DAN_3] = { -#line 11734 +#line 11799 .trainerName = _("KIRA & DAN"), -#line 11735 +#line 11800 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11736 +#line 11801 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11738 +#line 11803 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11739 +#line 11804 .doubleBattle = TRUE, -#line 11740 +#line 11805 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11742 +#line 11807 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11744 +#line 11809 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11743 +#line 11808 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11746 +#line 11811 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11748 +#line 11813 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11747 +#line 11812 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11750 +#line 11815 [TRAINER_KIRA_AND_DAN_4] = { -#line 11751 +#line 11816 .trainerName = _("KIRA & DAN"), -#line 11752 +#line 11817 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11753 +#line 11818 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11755 +#line 11820 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11756 +#line 11821 .doubleBattle = TRUE, -#line 11757 +#line 11822 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11759 +#line 11824 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11761 +#line 11826 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11760 +#line 11825 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11763 +#line 11828 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11765 +#line 11830 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11764 +#line 11829 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11767 +#line 11832 [TRAINER_KIRA_AND_DAN_5] = { -#line 11768 +#line 11833 .trainerName = _("KIRA & DAN"), -#line 11769 +#line 11834 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11770 +#line 11835 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 11772 +#line 11837 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11773 +#line 11838 .doubleBattle = TRUE, -#line 11774 +#line 11839 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11776 +#line 11841 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11778 +#line 11843 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11777 +#line 11842 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11780 +#line 11845 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11782 +#line 11847 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11781 +#line 11846 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11784 +#line 11849 [TRAINER_JOHANNA] = { -#line 11785 +#line 11850 .trainerName = _("JOHANNA"), -#line 11786 +#line 11851 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 11787 +#line 11852 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 11788 +#line 11853 F_TRAINER_FEMALE | -#line 11789 +#line 11854 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11790 +#line 11855 .doubleBattle = FALSE, -#line 11791 +#line 11856 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11793 +#line 11858 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11795 +#line 11860 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11794 +#line 11859 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11797 +#line 11862 [TRAINER_GERALD] = { -#line 11798 +#line 11863 .trainerName = _("GERALD"), -#line 11799 +#line 11864 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 11800 +#line 11865 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 11802 +#line 11867 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 11803 +#line 11868 .items = { ITEM_HYPER_POTION }, -#line 11804 +#line 11869 .doubleBattle = FALSE, -#line 11805 +#line 11870 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11807 +#line 11872 .species = SPECIES_KECLEON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11809 +#line 11874 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11808 +#line 11873 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11810 +#line 11875 MOVE_FLAMETHROWER, MOVE_FURY_SWIPES, MOVE_FEINT_ATTACK, @@ -29838,39 +29838,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 11815 +#line 11880 [TRAINER_VIVIAN] = { -#line 11816 +#line 11881 .trainerName = _("VIVIAN"), -#line 11817 +#line 11882 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11818 +#line 11883 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 11819 +#line 11884 F_TRAINER_FEMALE | -#line 11820 +#line 11885 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11821 +#line 11886 .doubleBattle = FALSE, -#line 11822 +#line 11887 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11824 +#line 11889 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11826 +#line 11891 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11825 +#line 11890 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11827 +#line 11892 MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, @@ -29878,17 +29878,17 @@ F_TRAINER_FEMALE | }, }, { -#line 11832 +#line 11897 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11834 +#line 11899 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11833 +#line 11898 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11835 +#line 11900 MOVE_THUNDER_PUNCH, MOVE_DETECT, MOVE_CONFUSION, @@ -29897,39 +29897,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 11840 +#line 11905 [TRAINER_DANIELLE] = { -#line 11841 +#line 11906 .trainerName = _("DANIELLE"), -#line 11842 +#line 11907 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11843 +#line 11908 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 11844 +#line 11909 F_TRAINER_FEMALE | -#line 11845 +#line 11910 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11846 +#line 11911 .doubleBattle = FALSE, -#line 11847 +#line 11912 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11849 +#line 11914 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11851 +#line 11916 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11850 +#line 11915 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11852 +#line 11917 MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, @@ -29938,37 +29938,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 11857 +#line 11922 [TRAINER_HIDEO] = { -#line 11858 +#line 11923 .trainerName = _("HIDEO"), -#line 11859 +#line 11924 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11860 +#line 11925 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 11862 +#line 11927 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11863 +#line 11928 .doubleBattle = FALSE, -#line 11864 +#line 11929 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11866 +#line 11931 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11868 +#line 11933 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11867 +#line 11932 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11869 +#line 11934 MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, @@ -29976,17 +29976,17 @@ F_TRAINER_FEMALE | }, }, { -#line 11874 +#line 11939 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11876 +#line 11941 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11875 +#line 11940 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11877 +#line 11942 MOVE_TACKLE, MOVE_POISON_GAS, MOVE_SLUDGE, @@ -29995,37 +29995,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 11882 +#line 11947 [TRAINER_KEIGO] = { -#line 11883 +#line 11948 .trainerName = _("KEIGO"), -#line 11884 +#line 11949 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11885 +#line 11950 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 11887 +#line 11952 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11888 +#line 11953 .doubleBattle = FALSE, -#line 11889 +#line 11954 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11891 +#line 11956 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11893 +#line 11958 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11892 +#line 11957 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11894 +#line 11959 MOVE_POISON_GAS, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, @@ -30033,17 +30033,17 @@ F_TRAINER_FEMALE | }, }, { -#line 11899 +#line 11964 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11901 +#line 11966 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11900 +#line 11965 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11902 +#line 11967 MOVE_SAND_ATTACK, MOVE_DOUBLE_TEAM, MOVE_FURY_CUTTER, @@ -30052,37 +30052,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 11907 +#line 11972 [TRAINER_RILEY] = { -#line 11908 +#line 11973 .trainerName = _("RILEY"), -#line 11909 +#line 11974 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11910 +#line 11975 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 11912 +#line 11977 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11913 +#line 11978 .doubleBattle = FALSE, -#line 11914 +#line 11979 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11916 +#line 11981 .species = SPECIES_NINCADA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11918 +#line 11983 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11917 +#line 11982 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11919 +#line 11984 MOVE_LEECH_LIFE, MOVE_FURY_SWIPES, MOVE_MIND_READER, @@ -30090,17 +30090,17 @@ F_TRAINER_FEMALE | }, }, { -#line 11924 +#line 11989 .species = SPECIES_KOFFING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11926 +#line 11991 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11925 +#line 11990 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11927 +#line 11992 MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, @@ -30109,170 +30109,170 @@ F_TRAINER_FEMALE | }, }, }, -#line 11932 +#line 11997 [TRAINER_FLINT] = { -#line 11933 +#line 11998 .trainerName = _("FLINT"), -#line 11934 +#line 11999 .trainerClass = TRAINER_CLASS_CAMPER, -#line 11935 +#line 12000 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 11937 +#line 12002 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11938 +#line 12003 .doubleBattle = FALSE, -#line 11939 +#line 12004 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 11941 +#line 12006 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11943 +#line 12008 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11942 +#line 12007 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11945 +#line 12010 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11947 +#line 12012 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11946 +#line 12011 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11949 +#line 12014 [TRAINER_ASHLEY] = { -#line 11950 +#line 12015 .trainerName = _("ASHLEY"), -#line 11951 +#line 12016 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 11952 +#line 12017 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 11953 +#line 12018 F_TRAINER_FEMALE | -#line 11954 +#line 12019 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11955 +#line 12020 .doubleBattle = FALSE, -#line 11956 +#line 12021 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 11958 +#line 12023 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11960 +#line 12025 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11959 +#line 12024 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11962 +#line 12027 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11964 +#line 12029 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11963 +#line 12028 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 11966 +#line 12031 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11968 +#line 12033 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11967 +#line 12032 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11970 +#line 12035 [TRAINER_WALLY_MAUVILLE] = { -#line 11971 +#line 12036 .trainerName = _("WALLY"), -#line 11972 +#line 12037 .trainerClass = TRAINER_CLASS_RIVAL, -#line 11973 +#line 12038 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 11975 +#line 12040 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11976 +#line 12041 .doubleBattle = FALSE, -#line 11977 +#line 12042 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 11979 +#line 12044 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11981 +#line 12046 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11980 +#line 12045 .lvl = 16, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 11983 +#line 12048 [TRAINER_WALLY_VR_2] = { -#line 11984 +#line 12049 .trainerName = _("WALLY"), -#line 11985 +#line 12050 .trainerClass = TRAINER_CLASS_RIVAL, -#line 11986 +#line 12051 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 11988 +#line 12053 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11989 +#line 12054 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 11990 +#line 12055 .doubleBattle = FALSE, -#line 11991 +#line 12056 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 11993 +#line 12058 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 11995 +#line 12060 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11994 +#line 12059 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 11996 +#line 12061 MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, @@ -30280,17 +30280,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12001 +#line 12066 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12003 +#line 12068 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12002 +#line 12067 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12004 +#line 12069 MOVE_SING, MOVE_ASSIST, MOVE_CHARM, @@ -30298,17 +30298,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12009 +#line 12074 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12011 +#line 12076 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12010 +#line 12075 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12012 +#line 12077 MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, @@ -30316,17 +30316,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12017 +#line 12082 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12019 +#line 12084 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12018 +#line 12083 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12020 +#line 12085 MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, @@ -30334,17 +30334,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12025 +#line 12090 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12027 +#line 12092 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12026 +#line 12091 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12028 +#line 12093 MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, @@ -30353,39 +30353,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 12033 +#line 12098 [TRAINER_WALLY_VR_3] = { -#line 12034 +#line 12099 .trainerName = _("WALLY"), -#line 12035 +#line 12100 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12036 +#line 12101 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 12038 +#line 12103 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12039 +#line 12104 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12040 +#line 12105 .doubleBattle = FALSE, -#line 12041 +#line 12106 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 12043 +#line 12108 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12045 +#line 12110 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12044 +#line 12109 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12046 +#line 12111 MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, @@ -30393,17 +30393,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12051 +#line 12116 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12053 +#line 12118 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12052 +#line 12117 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12054 +#line 12119 MOVE_SING, MOVE_ASSIST, MOVE_CHARM, @@ -30411,17 +30411,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12059 +#line 12124 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12061 +#line 12126 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12060 +#line 12125 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12062 +#line 12127 MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, @@ -30429,17 +30429,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12067 +#line 12132 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12069 +#line 12134 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12068 +#line 12133 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12070 +#line 12135 MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, @@ -30447,17 +30447,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12075 +#line 12140 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12077 +#line 12142 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12076 +#line 12141 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12078 +#line 12143 MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, @@ -30466,39 +30466,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 12083 +#line 12148 [TRAINER_WALLY_VR_4] = { -#line 12084 +#line 12149 .trainerName = _("WALLY"), -#line 12085 +#line 12150 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12086 +#line 12151 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 12088 +#line 12153 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12089 +#line 12154 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12090 +#line 12155 .doubleBattle = FALSE, -#line 12091 +#line 12156 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 12093 +#line 12158 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12095 +#line 12160 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12094 +#line 12159 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12096 +#line 12161 MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, @@ -30506,17 +30506,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12101 +#line 12166 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12103 +#line 12168 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12102 +#line 12167 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12104 +#line 12169 MOVE_SING, MOVE_ASSIST, MOVE_CHARM, @@ -30524,17 +30524,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12109 +#line 12174 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12111 +#line 12176 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12110 +#line 12175 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12112 +#line 12177 MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, @@ -30542,17 +30542,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12117 +#line 12182 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12119 +#line 12184 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12118 +#line 12183 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12120 +#line 12185 MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, @@ -30560,17 +30560,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12125 +#line 12190 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12127 +#line 12192 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12126 +#line 12191 .lvl = 54, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12128 +#line 12193 MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, @@ -30579,39 +30579,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 12133 +#line 12198 [TRAINER_WALLY_VR_5] = { -#line 12134 +#line 12199 .trainerName = _("WALLY"), -#line 12135 +#line 12200 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12136 +#line 12201 .trainerPic = TRAINER_PIC_WALLY, .encounterMusic_gender = -#line 12138 +#line 12203 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12139 +#line 12204 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12140 +#line 12205 .doubleBattle = FALSE, -#line 12141 +#line 12206 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 12143 +#line 12208 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12145 +#line 12210 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12144 +#line 12209 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12146 +#line 12211 MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, @@ -30619,17 +30619,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12151 +#line 12216 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12153 +#line 12218 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12152 +#line 12217 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12154 +#line 12219 MOVE_SING, MOVE_ASSIST, MOVE_CHARM, @@ -30637,17 +30637,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12159 +#line 12224 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12161 +#line 12226 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12160 +#line 12225 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12162 +#line 12227 MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, @@ -30655,17 +30655,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12167 +#line 12232 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12169 +#line 12234 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12168 +#line 12233 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12170 +#line 12235 MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, @@ -30673,17 +30673,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12175 +#line 12240 .species = SPECIES_GARDEVOIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12177 +#line 12242 .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12176 +#line 12241 .lvl = 57, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12178 +#line 12243 MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, @@ -30692,925 +30692,925 @@ F_TRAINER_FEMALE | }, }, }, -#line 12183 +#line 12248 [TRAINER_BRENDAN_LILYCOVE_MUDKIP] = { -#line 12184 +#line 12249 .trainerName = _("BRENDAN"), -#line 12185 +#line 12250 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12186 +#line 12251 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 12188 +#line 12253 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12189 +#line 12254 .doubleBattle = FALSE, -#line 12190 +#line 12255 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12192 +#line 12257 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12194 +#line 12259 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12193 +#line 12258 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12196 +#line 12261 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12198 +#line 12263 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12197 +#line 12262 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12200 +#line 12265 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12202 +#line 12267 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12201 +#line 12266 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12204 +#line 12269 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12206 +#line 12271 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12205 +#line 12270 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12208 +#line 12273 [TRAINER_BRENDAN_LILYCOVE_TREECKO] = { -#line 12209 +#line 12274 .trainerName = _("BRENDAN"), -#line 12210 +#line 12275 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12211 +#line 12276 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 12213 +#line 12278 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12214 +#line 12279 .doubleBattle = FALSE, -#line 12215 +#line 12280 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12217 +#line 12282 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12219 +#line 12284 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12218 +#line 12283 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12221 +#line 12286 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12223 +#line 12288 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12222 +#line 12287 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12225 +#line 12290 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12227 +#line 12292 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12226 +#line 12291 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12229 +#line 12294 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12231 +#line 12296 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12230 +#line 12295 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12233 +#line 12298 [TRAINER_BRENDAN_LILYCOVE_TORCHIC] = { -#line 12234 +#line 12299 .trainerName = _("BRENDAN"), -#line 12235 +#line 12300 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12236 +#line 12301 .trainerPic = TRAINER_PIC_BRENDAN, .encounterMusic_gender = -#line 12238 +#line 12303 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12239 +#line 12304 .doubleBattle = FALSE, -#line 12240 +#line 12305 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12242 +#line 12307 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12244 +#line 12309 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12243 +#line 12308 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12246 +#line 12311 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12248 +#line 12313 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12247 +#line 12312 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12250 +#line 12315 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12252 +#line 12317 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12251 +#line 12316 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12254 +#line 12319 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12256 +#line 12321 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12255 +#line 12320 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12258 +#line 12323 [TRAINER_MAY_LILYCOVE_MUDKIP] = { -#line 12259 +#line 12324 .trainerName = _("MAY"), -#line 12260 +#line 12325 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12261 +#line 12326 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 12262 +#line 12327 F_TRAINER_FEMALE | -#line 12263 +#line 12328 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12264 +#line 12329 .doubleBattle = FALSE, -#line 12265 +#line 12330 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12267 +#line 12332 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12269 +#line 12334 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12268 +#line 12333 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12271 +#line 12336 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12273 +#line 12338 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12272 +#line 12337 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12275 +#line 12340 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12277 +#line 12342 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12276 +#line 12341 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12279 +#line 12344 .species = SPECIES_GROVYLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12281 +#line 12346 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12280 +#line 12345 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12283 +#line 12348 [TRAINER_MAY_LILYCOVE_TREECKO] = { -#line 12284 +#line 12349 .trainerName = _("MAY"), -#line 12285 +#line 12350 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12286 +#line 12351 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 12287 +#line 12352 F_TRAINER_FEMALE | -#line 12288 +#line 12353 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12289 +#line 12354 .doubleBattle = FALSE, -#line 12290 +#line 12355 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12292 +#line 12357 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12294 +#line 12359 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12293 +#line 12358 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12296 +#line 12361 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12298 +#line 12363 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12297 +#line 12362 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12300 +#line 12365 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12302 +#line 12367 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12301 +#line 12366 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12304 +#line 12369 .species = SPECIES_COMBUSKEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12306 +#line 12371 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12305 +#line 12370 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12308 +#line 12373 [TRAINER_MAY_LILYCOVE_TORCHIC] = { -#line 12309 +#line 12374 .trainerName = _("MAY"), -#line 12310 +#line 12375 .trainerClass = TRAINER_CLASS_RIVAL, -#line 12311 +#line 12376 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 12312 +#line 12377 F_TRAINER_FEMALE | -#line 12313 +#line 12378 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12314 +#line 12379 .doubleBattle = FALSE, -#line 12315 +#line 12380 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12317 +#line 12382 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12319 +#line 12384 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12318 +#line 12383 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12321 +#line 12386 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12323 +#line 12388 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12322 +#line 12387 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12325 +#line 12390 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12327 +#line 12392 .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12326 +#line 12391 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12329 +#line 12394 .species = SPECIES_MARSHTOMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12331 +#line 12396 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12330 +#line 12395 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12333 +#line 12398 [TRAINER_JONAH] = { -#line 12334 +#line 12399 .trainerName = _("JONAH"), -#line 12335 +#line 12400 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12336 +#line 12401 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12338 +#line 12403 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12339 +#line 12404 .doubleBattle = FALSE, -#line 12340 +#line 12405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 12342 +#line 12407 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12344 +#line 12409 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12343 +#line 12408 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12346 +#line 12411 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12348 +#line 12413 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12347 +#line 12412 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12350 +#line 12415 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12352 +#line 12417 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12351 +#line 12416 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12354 +#line 12419 [TRAINER_HENRY] = { -#line 12355 +#line 12420 .trainerName = _("HENRY"), -#line 12356 +#line 12421 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12357 +#line 12422 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12359 +#line 12424 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12360 +#line 12425 .doubleBattle = FALSE, -#line 12361 +#line 12426 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12363 +#line 12428 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12365 +#line 12430 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12364 +#line 12429 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12367 +#line 12432 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12369 +#line 12434 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12368 +#line 12433 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12371 +#line 12436 [TRAINER_ROGER] = { -#line 12372 +#line 12437 .trainerName = _("ROGER"), -#line 12373 +#line 12438 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12374 +#line 12439 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12376 +#line 12441 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12377 +#line 12442 .doubleBattle = FALSE, -#line 12378 +#line 12443 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 12380 +#line 12445 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12382 +#line 12447 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12381 +#line 12446 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12384 +#line 12449 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12386 +#line 12451 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12385 +#line 12450 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12388 +#line 12453 .species = SPECIES_GYARADOS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12390 +#line 12455 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12389 +#line 12454 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12392 +#line 12457 [TRAINER_ALEXA] = { -#line 12393 +#line 12458 .trainerName = _("ALEXA"), -#line 12394 +#line 12459 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12395 +#line 12460 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 12396 +#line 12461 F_TRAINER_FEMALE | -#line 12397 +#line 12462 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12398 +#line 12463 .items = { ITEM_FULL_RESTORE }, -#line 12399 +#line 12464 .doubleBattle = FALSE, -#line 12400 +#line 12465 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12402 +#line 12467 .species = SPECIES_GLOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12404 +#line 12469 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12403 +#line 12468 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12406 +#line 12471 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12408 +#line 12473 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12407 +#line 12472 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12410 +#line 12475 [TRAINER_RUBEN] = { -#line 12411 +#line 12476 .trainerName = _("RUBEN"), -#line 12412 +#line 12477 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12413 +#line 12478 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 12415 +#line 12480 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12416 +#line 12481 .items = { ITEM_HYPER_POTION }, -#line 12417 +#line 12482 .doubleBattle = FALSE, -#line 12418 +#line 12483 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12420 +#line 12485 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12422 +#line 12487 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12421 +#line 12486 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12424 +#line 12489 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12426 +#line 12491 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12425 +#line 12490 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12428 +#line 12493 [TRAINER_KOJI_1] = { -#line 12429 +#line 12494 .trainerName = _("KOJI"), -#line 12430 +#line 12495 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 12431 +#line 12496 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 12433 +#line 12498 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12434 +#line 12499 .doubleBattle = FALSE, -#line 12435 +#line 12500 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 12437 +#line 12502 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12439 +#line 12504 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12438 +#line 12503 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12441 +#line 12506 [TRAINER_WAYNE] = { -#line 12442 +#line 12507 .trainerName = _("WAYNE"), -#line 12443 +#line 12508 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12444 +#line 12509 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12446 +#line 12511 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12447 +#line 12512 .doubleBattle = FALSE, -#line 12448 +#line 12513 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 12450 +#line 12515 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12452 +#line 12517 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12451 +#line 12516 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12454 +#line 12519 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12456 +#line 12521 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12455 +#line 12520 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12458 +#line 12523 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12460 +#line 12525 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12459 +#line 12524 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12462 +#line 12527 [TRAINER_AIDAN] = { -#line 12463 +#line 12528 .trainerName = _("AIDAN"), -#line 12464 +#line 12529 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 12465 +#line 12530 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 12467 +#line 12532 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12468 +#line 12533 .doubleBattle = FALSE, -#line 12469 +#line 12534 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12471 +#line 12536 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12473 +#line 12538 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12472 +#line 12537 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12475 +#line 12540 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12477 +#line 12542 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12476 +#line 12541 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12479 +#line 12544 [TRAINER_REED] = { -#line 12480 +#line 12545 .trainerName = _("REED"), -#line 12481 +#line 12546 .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 12482 +#line 12547 .trainerPic = TRAINER_PIC_SWIMMER_M, .encounterMusic_gender = -#line 12484 +#line 12549 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12485 +#line 12550 .doubleBattle = FALSE, -#line 12486 +#line 12551 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12488 +#line 12553 .species = SPECIES_SPHEAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12490 +#line 12555 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12489 +#line 12554 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12492 +#line 12557 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12494 +#line 12559 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12493 +#line 12558 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12496 +#line 12561 [TRAINER_TISHA] = { -#line 12497 +#line 12562 .trainerName = _("TISHA"), -#line 12498 +#line 12563 .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 12499 +#line 12564 .trainerPic = TRAINER_PIC_SWIMMER_F, .encounterMusic_gender = -#line 12500 +#line 12565 F_TRAINER_FEMALE | -#line 12501 +#line 12566 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12502 +#line 12567 .doubleBattle = FALSE, -#line 12503 +#line 12568 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 12505 +#line 12570 .species = SPECIES_CHINCHOU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12507 +#line 12572 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12506 +#line 12571 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12509 +#line 12574 [TRAINER_TORI_AND_TIA] = { -#line 12510 +#line 12575 .trainerName = _("TORI & TIA"), -#line 12511 +#line 12576 .trainerClass = TRAINER_CLASS_TWINS, -#line 12512 +#line 12577 .trainerPic = TRAINER_PIC_TWINS, .encounterMusic_gender = -#line 12514 +#line 12579 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12515 +#line 12580 .doubleBattle = TRUE, -#line 12516 +#line 12581 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12518 +#line 12583 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12520 +#line 12585 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12519 +#line 12584 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12522 +#line 12587 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12524 +#line 12589 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12523 +#line 12588 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12526 +#line 12591 [TRAINER_KIM_AND_IRIS] = { -#line 12527 +#line 12592 .trainerName = _("KIM & IRIS"), -#line 12528 +#line 12593 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12529 +#line 12594 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 12531 +#line 12596 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12532 +#line 12597 .doubleBattle = TRUE, -#line 12533 +#line 12598 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12535 +#line 12600 .species = SPECIES_SWABLU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12537 +#line 12602 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12536 +#line 12601 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12538 +#line 12603 MOVE_SING, MOVE_FURY_ATTACK, MOVE_SAFEGUARD, @@ -31618,17 +31618,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12543 +#line 12608 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12545 +#line 12610 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12544 +#line 12609 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12546 +#line 12611 MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_REST, @@ -31637,37 +31637,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12551 +#line 12616 [TRAINER_TYRA_AND_IVY] = { -#line 12552 +#line 12617 .trainerName = _("TYRA & IVY"), -#line 12553 +#line 12618 .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12554 +#line 12619 .trainerPic = TRAINER_PIC_SR_AND_JR, .encounterMusic_gender = -#line 12556 +#line 12621 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12557 +#line 12622 .doubleBattle = TRUE, -#line 12558 +#line 12623 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12560 +#line 12625 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12562 +#line 12627 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12561 +#line 12626 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12563 +#line 12628 MOVE_GROWTH, MOVE_STUN_SPORE, MOVE_MEGA_DRAIN, @@ -31675,17 +31675,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12568 +#line 12633 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12570 +#line 12635 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12569 +#line 12634 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12571 +#line 12636 MOVE_DEFENSE_CURL, MOVE_ROLLOUT, MOVE_MUD_SPORT, @@ -31694,37 +31694,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12576 +#line 12641 [TRAINER_MEL_AND_PAUL] = { -#line 12577 +#line 12642 .trainerName = _("MEL & PAUL"), -#line 12578 +#line 12643 .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 12579 +#line 12644 .trainerPic = TRAINER_PIC_YOUNG_COUPLE, .encounterMusic_gender = -#line 12581 +#line 12646 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12582 +#line 12647 .doubleBattle = TRUE, -#line 12583 +#line 12648 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12585 +#line 12650 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12587 +#line 12652 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12586 +#line 12651 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12588 +#line 12653 MOVE_GUST, MOVE_PSYBEAM, MOVE_TOXIC, @@ -31732,17 +31732,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12593 +#line 12658 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12595 +#line 12660 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12594 +#line 12659 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12596 +#line 12661 MOVE_GUST, MOVE_MEGA_DRAIN, MOVE_ATTRACT, @@ -31751,37 +31751,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12601 +#line 12666 [TRAINER_JOHN_AND_JAY_1] = { -#line 12602 +#line 12667 .trainerName = _("JOHN & JAY"), -#line 12603 +#line 12668 .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12604 +#line 12669 .trainerPic = TRAINER_PIC_OLD_COUPLE, .encounterMusic_gender = -#line 12606 +#line 12671 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12607 +#line 12672 .doubleBattle = TRUE, -#line 12608 +#line 12673 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12610 +#line 12675 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12612 +#line 12677 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12611 +#line 12676 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12613 +#line 12678 MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, @@ -31789,17 +31789,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12618 +#line 12683 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12620 +#line 12685 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12619 +#line 12684 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12621 +#line 12686 MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, @@ -31808,37 +31808,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12626 +#line 12691 [TRAINER_JOHN_AND_JAY_2] = { -#line 12627 +#line 12692 .trainerName = _("JOHN & JAY"), -#line 12628 +#line 12693 .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12629 +#line 12694 .trainerPic = TRAINER_PIC_OLD_COUPLE, .encounterMusic_gender = -#line 12631 +#line 12696 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12632 +#line 12697 .doubleBattle = TRUE, -#line 12633 +#line 12698 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12635 +#line 12700 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12637 +#line 12702 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12636 +#line 12701 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12638 +#line 12703 MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, @@ -31846,17 +31846,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12643 +#line 12708 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12645 +#line 12710 .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12644 +#line 12709 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12646 +#line 12711 MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, @@ -31865,37 +31865,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12651 +#line 12716 [TRAINER_JOHN_AND_JAY_3] = { -#line 12652 +#line 12717 .trainerName = _("JOHN & JAY"), -#line 12653 +#line 12718 .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12654 +#line 12719 .trainerPic = TRAINER_PIC_OLD_COUPLE, .encounterMusic_gender = -#line 12656 +#line 12721 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12657 +#line 12722 .doubleBattle = TRUE, -#line 12658 +#line 12723 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12660 +#line 12725 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12662 +#line 12727 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12661 +#line 12726 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12663 +#line 12728 MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, @@ -31903,17 +31903,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12668 +#line 12733 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12670 +#line 12735 .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12669 +#line 12734 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12671 +#line 12736 MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, @@ -31922,37 +31922,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12676 +#line 12741 [TRAINER_JOHN_AND_JAY_4] = { -#line 12677 +#line 12742 .trainerName = _("JOHN & JAY"), -#line 12678 +#line 12743 .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12679 +#line 12744 .trainerPic = TRAINER_PIC_OLD_COUPLE, .encounterMusic_gender = -#line 12681 +#line 12746 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12682 +#line 12747 .doubleBattle = TRUE, -#line 12683 +#line 12748 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SETUP_FIRST_TURN, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12685 +#line 12750 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12687 +#line 12752 .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12686 +#line 12751 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12688 +#line 12753 MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, @@ -31960,17 +31960,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12693 +#line 12758 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12695 +#line 12760 .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12694 +#line 12759 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12696 +#line 12761 MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, @@ -31979,37 +31979,37 @@ F_TRAINER_FEMALE | }, }, }, -#line 12701 +#line 12766 [TRAINER_JOHN_AND_JAY_5] = { -#line 12702 +#line 12767 .trainerName = _("JOHN & JAY"), -#line 12703 +#line 12768 .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12704 +#line 12769 .trainerPic = TRAINER_PIC_OLD_COUPLE, .encounterMusic_gender = -#line 12706 +#line 12771 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12707 +#line 12772 .doubleBattle = TRUE, -#line 12708 +#line 12773 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12710 +#line 12775 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12712 +#line 12777 .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12711 +#line 12776 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12713 +#line 12778 MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, @@ -32017,17 +32017,17 @@ F_TRAINER_FEMALE | }, }, { -#line 12718 +#line 12783 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12720 +#line 12785 .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12719 +#line 12784 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 12721 +#line 12786 MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, @@ -32036,843 +32036,679 @@ F_TRAINER_FEMALE | }, }, }, -#line 12726 +#line 12791 [TRAINER_RELI_AND_IAN] = { -#line 12727 +#line 12792 .trainerName = _("RELI & IAN"), -#line 12728 +#line 12793 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12729 +#line 12794 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12731 +#line 12796 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12732 +#line 12797 .doubleBattle = TRUE, -#line 12733 +#line 12798 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12735 +#line 12800 .species = SPECIES_AZUMARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12737 +#line 12802 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12736 +#line 12801 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12739 +#line 12804 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12741 +#line 12806 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12740 +#line 12805 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12743 +#line 12808 [TRAINER_LILA_AND_ROY_1] = { -#line 12744 +#line 12809 .trainerName = _("LILA & ROY"), -#line 12745 +#line 12810 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12746 +#line 12811 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12748 +#line 12813 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12749 +#line 12814 .doubleBattle = TRUE, -#line 12750 +#line 12815 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12752 +#line 12817 .species = SPECIES_CHINCHOU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12754 +#line 12819 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12753 +#line 12818 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12756 +#line 12821 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12758 +#line 12823 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12757 +#line 12822 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12760 +#line 12825 [TRAINER_LILA_AND_ROY_2] = { -#line 12761 +#line 12826 .trainerName = _("LILA & ROY"), -#line 12762 +#line 12827 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12763 +#line 12828 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12765 +#line 12830 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12766 +#line 12831 .doubleBattle = TRUE, -#line 12767 +#line 12832 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12769 +#line 12834 .species = SPECIES_CHINCHOU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12771 +#line 12836 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12770 +#line 12835 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12773 +#line 12838 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12775 +#line 12840 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12774 +#line 12839 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12777 +#line 12842 [TRAINER_LILA_AND_ROY_3] = { -#line 12778 +#line 12843 .trainerName = _("LILA & ROY"), -#line 12779 +#line 12844 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12780 +#line 12845 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12782 +#line 12847 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12783 +#line 12848 .doubleBattle = TRUE, -#line 12784 +#line 12849 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12786 +#line 12851 .species = SPECIES_LANTURN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12788 +#line 12853 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12787 +#line 12852 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12790 +#line 12855 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12792 +#line 12857 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12791 +#line 12856 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12794 +#line 12859 [TRAINER_LILA_AND_ROY_4] = { -#line 12795 +#line 12860 .trainerName = _("LILA & ROY"), -#line 12796 +#line 12861 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12797 +#line 12862 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12799 +#line 12864 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12800 +#line 12865 .doubleBattle = TRUE, -#line 12801 +#line 12866 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12803 +#line 12868 .species = SPECIES_LANTURN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12805 +#line 12870 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12804 +#line 12869 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12807 +#line 12872 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12809 +#line 12874 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12808 +#line 12873 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12811 +#line 12876 [TRAINER_LILA_AND_ROY_5] = { -#line 12812 +#line 12877 .trainerName = _("LILA & ROY"), -#line 12813 +#line 12878 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12814 +#line 12879 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12816 +#line 12881 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12817 +#line 12882 .doubleBattle = TRUE, -#line 12818 +#line 12883 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12820 +#line 12885 .species = SPECIES_LANTURN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12822 +#line 12887 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12821 +#line 12886 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12824 +#line 12889 .species = SPECIES_SHARPEDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12826 +#line 12891 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12825 +#line 12890 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12828 +#line 12893 [TRAINER_LISA_AND_RAY] = { -#line 12829 +#line 12894 .trainerName = _("LISA & RAY"), -#line 12830 +#line 12895 .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12831 +#line 12896 .trainerPic = TRAINER_PIC_SIS_AND_BRO, .encounterMusic_gender = -#line 12833 +#line 12898 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12834 +#line 12899 .doubleBattle = TRUE, -#line 12835 +#line 12900 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12837 +#line 12902 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12839 +#line 12904 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12838 +#line 12903 .lvl = 27, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12841 +#line 12906 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12843 +#line 12908 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12842 +#line 12907 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12845 +#line 12910 [TRAINER_CHRIS] = { -#line 12846 +#line 12911 .trainerName = _("CHRIS"), -#line 12847 +#line 12912 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12848 +#line 12913 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12850 +#line 12915 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12851 +#line 12916 .doubleBattle = FALSE, -#line 12852 +#line 12917 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 12854 +#line 12919 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12856 +#line 12921 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12855 +#line 12920 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12858 +#line 12923 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12860 +#line 12925 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12859 +#line 12924 .lvl = 20, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12862 +#line 12927 .species = SPECIES_FEEBAS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12864 +#line 12929 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12863 +#line 12928 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12866 +#line 12931 .species = SPECIES_CARVANHA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12868 +#line 12933 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12867 +#line 12932 .lvl = 23, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12870 +#line 12935 [TRAINER_DAWSON] = { -#line 12871 +#line 12936 .trainerName = _("DAWSON"), -#line 12872 +#line 12937 .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 12873 +#line 12938 .trainerPic = TRAINER_PIC_RICH_BOY, .encounterMusic_gender = -#line 12875 +#line 12940 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 12876 +#line 12941 .doubleBattle = FALSE, -#line 12877 +#line 12942 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12879 +#line 12944 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12879 +#line 12944 .heldItem = ITEM_NUGGET, -#line 12881 +#line 12946 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12880 +#line 12945 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12883 +#line 12948 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12885 +#line 12950 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12884 +#line 12949 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12887 +#line 12952 [TRAINER_SARAH] = { -#line 12888 +#line 12953 .trainerName = _("SARAH"), -#line 12889 +#line 12954 .trainerClass = TRAINER_CLASS_LADY, -#line 12890 +#line 12955 .trainerPic = TRAINER_PIC_LADY, .encounterMusic_gender = -#line 12891 +#line 12956 F_TRAINER_FEMALE | -#line 12892 +#line 12957 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12893 +#line 12958 .items = { ITEM_FULL_RESTORE }, -#line 12894 +#line 12959 .doubleBattle = FALSE, -#line 12895 +#line 12960 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12897 +#line 12962 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12899 +#line 12964 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12898 +#line 12963 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12901 +#line 12966 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12901 +#line 12966 .heldItem = ITEM_NUGGET, -#line 12903 +#line 12968 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12902 +#line 12967 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12905 +#line 12970 [TRAINER_DARIAN] = { -#line 12906 +#line 12971 .trainerName = _("DARIAN"), -#line 12907 +#line 12972 .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12908 +#line 12973 .trainerPic = TRAINER_PIC_FISHERMAN, .encounterMusic_gender = -#line 12910 +#line 12975 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12911 +#line 12976 .doubleBattle = FALSE, -#line 12912 +#line 12977 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 12914 +#line 12979 .species = SPECIES_MAGIKARP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12916 +#line 12981 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12915 +#line 12980 .lvl = 9, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12918 +#line 12983 [TRAINER_HAILEY] = { -#line 12919 +#line 12984 .trainerName = _("HAILEY"), -#line 12920 +#line 12985 .trainerClass = TRAINER_CLASS_TUBER_F, -#line 12921 +#line 12986 .trainerPic = TRAINER_PIC_TUBER_F, .encounterMusic_gender = -#line 12922 +#line 12987 F_TRAINER_FEMALE | -#line 12923 +#line 12988 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12924 +#line 12989 .doubleBattle = FALSE, -#line 12925 +#line 12990 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 12927 +#line 12992 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12929 +#line 12994 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12928 +#line 12993 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12931 +#line 12996 [TRAINER_CHANDLER] = { -#line 12932 +#line 12997 .trainerName = _("CHANDLER"), -#line 12933 +#line 12998 .trainerClass = TRAINER_CLASS_TUBER_M, -#line 12934 +#line 12999 .trainerPic = TRAINER_PIC_TUBER_M, .encounterMusic_gender = -#line 12936 +#line 13001 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12937 +#line 13002 .doubleBattle = FALSE, -#line 12938 +#line 13003 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12940 +#line 13005 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12942 +#line 13007 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12941 +#line 13006 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12944 +#line 13009 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12946 +#line 13011 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12945 +#line 13010 .lvl = 12, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12948 +#line 13013 [TRAINER_KALEB] = { -#line 12949 +#line 13014 .trainerName = _("KALEB"), -#line 12950 +#line 13015 .trainerClass = TRAINER_CLASS_POKEFAN, -#line 12951 +#line 13016 .trainerPic = TRAINER_PIC_POKEFAN_M, .encounterMusic_gender = -#line 12953 +#line 13018 TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12954 +#line 13019 .doubleBattle = FALSE, -#line 12955 +#line 13020 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12957 +#line 13022 .species = SPECIES_MINUN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12957 +#line 13022 .heldItem = ITEM_ORAN_BERRY, -#line 12959 +#line 13024 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12958 +#line 13023 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 12961 +#line 13026 .species = SPECIES_PLUSLE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12961 +#line 13026 .heldItem = ITEM_ORAN_BERRY, -#line 12963 +#line 13028 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12962 +#line 13027 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 12965 +#line 13030 [TRAINER_JOSEPH] = { -#line 12966 +#line 13031 .trainerName = _("JOSEPH"), -#line 12967 +#line 13032 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 12968 +#line 13033 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 12970 +#line 13035 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12971 +#line 13036 .doubleBattle = FALSE, -#line 12972 +#line 13037 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 12974 +#line 13039 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 12976 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12975 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12978 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12980 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12979 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12982 - [TRAINER_ALYSSA] = - { -#line 12983 - .trainerName = _("ALYSSA"), -#line 12984 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 12985 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 12986 -F_TRAINER_FEMALE | -#line 12987 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12988 - .doubleBattle = FALSE, -#line 12989 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12991 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12993 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12992 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12995 - [TRAINER_MARCOS] = - { -#line 12996 - .trainerName = _("MARCOS"), -#line 12997 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 12998 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13000 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13001 - .doubleBattle = FALSE, -#line 13002 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13004 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13006 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13005 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13008 - [TRAINER_RHETT] = - { -#line 13009 - .trainerName = _("RHETT"), -#line 13010 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 13011 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 13013 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13014 - .doubleBattle = FALSE, -#line 13015 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13017 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13019 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13018 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13021 - [TRAINER_TYRON] = - { -#line 13022 - .trainerName = _("TYRON"), -#line 13023 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13024 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13026 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13027 - .doubleBattle = FALSE, -#line 13028 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13030 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13032 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13031 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13034 - [TRAINER_CELINA] = - { -#line 13035 - .trainerName = _("CELINA"), -#line 13036 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13037 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 13038 -F_TRAINER_FEMALE | -#line 13039 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13040 - .doubleBattle = FALSE, #line 13041 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13040 + .lvl = 14, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 13043 - .species = SPECIES_ROSELIA, + .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, #line 13045 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 13044 - .lvl = 18, + .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 13047 - [TRAINER_BIANCA] = + [TRAINER_ALYSSA] = { #line 13048 - .trainerName = _("BIANCA"), + .trainerName = _("ALYSSA"), #line 13049 - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = TRAINER_CLASS_TRIATHLETE, #line 13050 - .trainerPic = TRAINER_PIC_PICNICKER, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, .encounterMusic_gender = #line 13051 F_TRAINER_FEMALE | #line 13052 - TRAINER_ENCOUNTER_MUSIC_GIRL, + TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13053 .doubleBattle = FALSE, #line 13054 @@ -32882,29 +32718,29 @@ F_TRAINER_FEMALE | { { #line 13056 - .species = SPECIES_SHROOMISH, + .species = SPECIES_MAGNEMITE, .gender = TRAINER_MON_RANDOM_GENDER, #line 13058 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 13057 - .lvl = 18, + .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 13060 - [TRAINER_HAYDEN] = + [TRAINER_MARCOS] = { #line 13061 - .trainerName = _("HAYDEN"), + .trainerName = _("MARCOS"), #line 13062 - .trainerClass = TRAINER_CLASS_KINDLER, + .trainerClass = TRAINER_CLASS_GUITARIST, #line 13063 - .trainerPic = TRAINER_PIC_KINDLER, + .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = #line 13065 - TRAINER_ENCOUNTER_MUSIC_HIKER, + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13066 .doubleBattle = FALSE, #line 13067 @@ -32914,700 +32750,704 @@ F_TRAINER_FEMALE | { { #line 13069 - .species = SPECIES_NUMEL, + .species = SPECIES_VOLTORB, .gender = TRAINER_MON_RANDOM_GENDER, #line 13071 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), #line 13070 - .lvl = 18, + .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 13073 - [TRAINER_SOPHIE] = + [TRAINER_RHETT] = { #line 13074 - .trainerName = _("SOPHIE"), + .trainerName = _("RHETT"), #line 13075 - .trainerClass = TRAINER_CLASS_PICNICKER, + .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 13076 - .trainerPic = TRAINER_PIC_PICNICKER, + .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 13077 -F_TRAINER_FEMALE | #line 13078 - TRAINER_ENCOUNTER_MUSIC_GIRL, + TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13079 .doubleBattle = FALSE, #line 13080 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .partySize = 1, .party = (const struct TrainerMon[]) { { #line 13082 - .species = SPECIES_MARILL, + .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, #line 13084 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), #line 13083 - .lvl = 17, + .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - { + }, + }, #line 13086 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13088 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + [TRAINER_TYRON] = + { #line 13087 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13090 - [TRAINER_COBY] = - { -#line 13091 - .trainerName = _("COBY"), -#line 13092 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13093 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13095 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13096 - .doubleBattle = FALSE, -#line 13097 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13099 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13101 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13100 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13103 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13105 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13104 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13107 - [TRAINER_LAWRENCE] = - { -#line 13108 - .trainerName = _("LAWRENCE"), -#line 13109 + .trainerName = _("TYRON"), +#line 13088 .trainerClass = TRAINER_CLASS_CAMPER, -#line 13110 +#line 13089 .trainerPic = TRAINER_PIC_CAMPER, .encounterMusic_gender = -#line 13112 +#line 13091 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13113 +#line 13092 .doubleBattle = FALSE, -#line 13114 +#line 13093 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13116 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13118 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13117 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13120 +#line 13095 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13122 +#line 13097 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13121 - .lvl = 18, +#line 13096 + .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13124 - [TRAINER_WYATT] = +#line 13099 + [TRAINER_CELINA] = { -#line 13125 - .trainerName = _("WYATT"), -#line 13126 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 13127 - .trainerPic = TRAINER_PIC_POKEMANIAC, +#line 13100 + .trainerName = _("CELINA"), +#line 13101 + .trainerClass = TRAINER_CLASS_AROMA_LADY, +#line 13102 + .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 13129 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13130 +#line 13103 +F_TRAINER_FEMALE | +#line 13104 + TRAINER_ENCOUNTER_MUSIC_FEMALE, +#line 13105 .doubleBattle = FALSE, -#line 13131 +#line 13106 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13133 - .species = SPECIES_ARON, +#line 13108 + .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13135 +#line 13110 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13134 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13137 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13139 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13138 +#line 13109 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13141 - [TRAINER_ANGELINA] = +#line 13112 + [TRAINER_BIANCA] = { -#line 13142 - .trainerName = _("ANGELINA"), -#line 13143 +#line 13113 + .trainerName = _("BIANCA"), +#line 13114 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13144 +#line 13115 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 13145 +#line 13116 F_TRAINER_FEMALE | -#line 13146 +#line 13117 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13147 +#line 13118 .doubleBattle = FALSE, -#line 13148 +#line 13119 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13121 + .species = SPECIES_SHROOMISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13123 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13122 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13125 + [TRAINER_HAYDEN] = + { +#line 13126 + .trainerName = _("HAYDEN"), +#line 13127 + .trainerClass = TRAINER_CLASS_KINDLER, +#line 13128 + .trainerPic = TRAINER_PIC_KINDLER, + .encounterMusic_gender = +#line 13130 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 13131 + .doubleBattle = FALSE, +#line 13132 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13134 + .species = SPECIES_NUMEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13136 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13135 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13138 + [TRAINER_SOPHIE] = + { +#line 13139 + .trainerName = _("SOPHIE"), +#line 13140 + .trainerClass = TRAINER_CLASS_PICNICKER, +#line 13141 + .trainerPic = TRAINER_PIC_PICNICKER, + .encounterMusic_gender = +#line 13142 +F_TRAINER_FEMALE | +#line 13143 + TRAINER_ENCOUNTER_MUSIC_GIRL, +#line 13144 + .doubleBattle = FALSE, +#line 13145 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13150 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13152 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13151 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13154 +#line 13147 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13156 +#line 13149 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13148 + .lvl = 17, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13151 + .species = SPECIES_LOMBRE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13153 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13152 + .lvl = 19, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 13155 + [TRAINER_COBY] = + { +#line 13156 + .trainerName = _("COBY"), +#line 13157 + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, +#line 13158 + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .encounterMusic_gender = +#line 13160 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 13161 + .doubleBattle = FALSE, +#line 13162 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13164 + .species = SPECIES_SKARMORY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13166 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13165 + .lvl = 17, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13168 + .species = SPECIES_SWELLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13170 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13169 + .lvl = 19, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13172 + [TRAINER_LAWRENCE] = + { +#line 13173 + .trainerName = _("LAWRENCE"), +#line 13174 + .trainerClass = TRAINER_CLASS_CAMPER, +#line 13175 + .trainerPic = TRAINER_PIC_CAMPER, + .encounterMusic_gender = +#line 13177 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 13178 + .doubleBattle = FALSE, +#line 13179 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13181 + .species = SPECIES_BALTOY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13183 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13182 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13185 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13187 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13186 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13158 - [TRAINER_KAI] = +#line 13189 + [TRAINER_WYATT] = { -#line 13159 - .trainerName = _("KAI"), -#line 13160 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 13161 - .trainerPic = TRAINER_PIC_FISHERMAN, +#line 13190 + .trainerName = _("WYATT"), +#line 13191 + .trainerClass = TRAINER_CLASS_POKEMANIAC, +#line 13192 + .trainerPic = TRAINER_PIC_POKEMANIAC, .encounterMusic_gender = -#line 13163 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13164 +#line 13194 + TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, +#line 13195 .doubleBattle = FALSE, -#line 13165 +#line 13196 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, + .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13167 - .species = SPECIES_BARBOACH, +#line 13198 + .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13169 +#line 13200 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13168 - .lvl = 19, +#line 13199 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13202 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13204 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13203 + .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13171 - [TRAINER_CHARLOTTE] = +#line 13206 + [TRAINER_ANGELINA] = { -#line 13172 - .trainerName = _("CHARLOTTE"), -#line 13173 +#line 13207 + .trainerName = _("ANGELINA"), +#line 13208 .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13174 +#line 13209 .trainerPic = TRAINER_PIC_PICNICKER, .encounterMusic_gender = -#line 13175 +#line 13210 F_TRAINER_FEMALE | -#line 13176 +#line 13211 TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13177 +#line 13212 .doubleBattle = FALSE, -#line 13178 +#line 13213 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13215 + .species = SPECIES_LOMBRE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13217 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13216 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13219 + .species = SPECIES_MARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13221 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13220 + .lvl = 18, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13223 + [TRAINER_KAI] = + { +#line 13224 + .trainerName = _("KAI"), +#line 13225 + .trainerClass = TRAINER_CLASS_FISHERMAN, +#line 13226 + .trainerPic = TRAINER_PIC_FISHERMAN, + .encounterMusic_gender = +#line 13228 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 13229 + .doubleBattle = FALSE, +#line 13230 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13180 - .species = SPECIES_NUZLEAF, +#line 13232 + .species = SPECIES_BARBOACH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13182 +#line 13234 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13181 +#line 13233 .lvl = 19, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13184 +#line 13236 + [TRAINER_CHARLOTTE] = + { +#line 13237 + .trainerName = _("CHARLOTTE"), +#line 13238 + .trainerClass = TRAINER_CLASS_PICNICKER, +#line 13239 + .trainerPic = TRAINER_PIC_PICNICKER, + .encounterMusic_gender = +#line 13240 +F_TRAINER_FEMALE | +#line 13241 + TRAINER_ENCOUNTER_MUSIC_GIRL, +#line 13242 + .doubleBattle = FALSE, +#line 13243 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13245 + .species = SPECIES_NUZLEAF, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13247 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13246 + .lvl = 19, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13249 [TRAINER_DEANDRE] = { -#line 13185 +#line 13250 .trainerName = _("DEANDRE"), -#line 13186 +#line 13251 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13187 +#line 13252 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 13189 +#line 13254 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13190 +#line 13255 .doubleBattle = FALSE, -#line 13191 +#line 13256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 13193 +#line 13258 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13195 +#line 13260 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13194 +#line 13259 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13197 +#line 13262 .species = SPECIES_ARON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13199 +#line 13264 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13198 +#line 13263 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13201 +#line 13266 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13203 +#line 13268 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13202 +#line 13267 .lvl = 14, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13205 +#line 13270 [TRAINER_GRUNT_MAGMA_HIDEOUT_1] = { -#line 13206 +#line 13271 .trainerName = _("GRUNT"), -#line 13207 +#line 13272 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13208 +#line 13273 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13210 +#line 13275 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13211 +#line 13276 .doubleBattle = FALSE, -#line 13212 +#line 13277 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13214 +#line 13279 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13216 +#line 13281 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13215 +#line 13280 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13218 +#line 13283 [TRAINER_GRUNT_MAGMA_HIDEOUT_2] = { -#line 13219 +#line 13284 .trainerName = _("GRUNT"), -#line 13220 +#line 13285 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13221 +#line 13286 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13223 +#line 13288 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13224 +#line 13289 .doubleBattle = FALSE, -#line 13225 +#line 13290 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13227 +#line 13292 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13229 +#line 13294 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13228 +#line 13293 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13231 +#line 13296 [TRAINER_GRUNT_MAGMA_HIDEOUT_3] = { -#line 13232 +#line 13297 .trainerName = _("GRUNT"), -#line 13233 +#line 13298 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13234 +#line 13299 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13236 +#line 13301 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13237 +#line 13302 .doubleBattle = FALSE, -#line 13238 +#line 13303 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13240 +#line 13305 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13242 +#line 13307 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13241 +#line 13306 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13244 +#line 13309 [TRAINER_GRUNT_MAGMA_HIDEOUT_4] = { -#line 13245 +#line 13310 .trainerName = _("GRUNT"), -#line 13246 +#line 13311 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13247 +#line 13312 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13249 +#line 13314 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13250 +#line 13315 .doubleBattle = FALSE, -#line 13251 +#line 13316 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13253 +#line 13318 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13255 +#line 13320 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13254 +#line 13319 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13257 +#line 13322 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13259 +#line 13324 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13258 +#line 13323 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13261 +#line 13326 [TRAINER_GRUNT_MAGMA_HIDEOUT_5] = { -#line 13262 +#line 13327 .trainerName = _("GRUNT"), -#line 13263 +#line 13328 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13264 +#line 13329 .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13266 +#line 13331 TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13267 +#line 13332 .doubleBattle = FALSE, -#line 13268 +#line 13333 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13270 +#line 13335 .species = SPECIES_BALTOY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13272 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13271 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13274 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13276 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13275 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13278 - [TRAINER_GRUNT_MAGMA_HIDEOUT_6] = - { -#line 13279 - .trainerName = _("GRUNT"), -#line 13280 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13281 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13283 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13284 - .doubleBattle = FALSE, -#line 13285 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13287 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13289 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13288 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13291 - [TRAINER_GRUNT_MAGMA_HIDEOUT_7] = - { -#line 13292 - .trainerName = _("GRUNT"), -#line 13293 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13294 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13296 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13297 - .doubleBattle = FALSE, -#line 13298 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13300 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13302 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13301 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13304 - [TRAINER_GRUNT_MAGMA_HIDEOUT_8] = - { -#line 13305 - .trainerName = _("GRUNT"), -#line 13306 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13307 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13309 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13310 - .doubleBattle = FALSE, -#line 13311 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13313 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13315 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13314 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13317 - [TRAINER_GRUNT_MAGMA_HIDEOUT_9] = - { -#line 13318 - .trainerName = _("GRUNT"), -#line 13319 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13320 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13322 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13323 - .doubleBattle = FALSE, -#line 13324 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13326 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13328 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13327 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13330 - [TRAINER_GRUNT_MAGMA_HIDEOUT_10] = - { -#line 13331 - .trainerName = _("GRUNT"), -#line 13332 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13333 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13335 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13336 - .doubleBattle = FALSE, #line 13337 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13336 + .lvl = 28, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, { #line 13339 - .species = SPECIES_MIGHTYENA, + .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, #line 13341 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 13340 - .lvl = 29, + .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 13343 - [TRAINER_GRUNT_MAGMA_HIDEOUT_11] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_6] = { #line 13344 .trainerName = _("GRUNT"), @@ -33627,7 +33467,7 @@ F_TRAINER_FEMALE | { { #line 13352 - .species = SPECIES_BALTOY, + .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 13354 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -33639,7 +33479,7 @@ F_TRAINER_FEMALE | }, }, #line 13356 - [TRAINER_GRUNT_MAGMA_HIDEOUT_12] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_7] = { #line 13357 .trainerName = _("GRUNT"), @@ -33659,7 +33499,7 @@ F_TRAINER_FEMALE | { { #line 13365 - .species = SPECIES_NUMEL, + .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, #line 13367 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -33671,7 +33511,7 @@ F_TRAINER_FEMALE | }, }, #line 13369 - [TRAINER_GRUNT_MAGMA_HIDEOUT_13] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_8] = { #line 13370 .trainerName = _("GRUNT"), @@ -33691,7 +33531,7 @@ F_TRAINER_FEMALE | { { #line 13378 - .species = SPECIES_ZUBAT, + .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 13380 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -33703,17 +33543,15 @@ F_TRAINER_FEMALE | }, }, #line 13382 - [TRAINER_GRUNT_MAGMA_HIDEOUT_14] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_9] = { #line 13383 .trainerName = _("GRUNT"), #line 13384 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13385 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13386 -F_TRAINER_FEMALE | #line 13387 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13388 @@ -33725,7 +33563,7 @@ F_TRAINER_FEMALE | { { #line 13391 - .species = SPECIES_MIGHTYENA, + .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, #line 13393 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -33737,17 +33575,15 @@ F_TRAINER_FEMALE | }, }, #line 13395 - [TRAINER_GRUNT_MAGMA_HIDEOUT_15] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_10] = { #line 13396 .trainerName = _("GRUNT"), #line 13397 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13398 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13399 -F_TRAINER_FEMALE | #line 13400 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13401 @@ -33759,7 +33595,7 @@ F_TRAINER_FEMALE | { { #line 13404 - .species = SPECIES_NUMEL, + .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, #line 13406 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), @@ -33771,17 +33607,15 @@ F_TRAINER_FEMALE | }, }, #line 13408 - [TRAINER_GRUNT_MAGMA_HIDEOUT_16] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_11] = { #line 13409 .trainerName = _("GRUNT"), #line 13410 .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13411 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = -#line 13412 -F_TRAINER_FEMALE | #line 13413 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13414 @@ -33805,14 +33639,14 @@ F_TRAINER_FEMALE | }, }, #line 13421 - [TRAINER_TABITHA_MAGMA_HIDEOUT] = + [TRAINER_GRUNT_MAGMA_HIDEOUT_12] = { #line 13422 - .trainerName = _("TABITHA"), + .trainerName = _("GRUNT"), #line 13423 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, #line 13424 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, .encounterMusic_gender = #line 13426 TRAINER_ENCOUNTER_MUSIC_MAGMA, @@ -33820,7 +33654,7 @@ F_TRAINER_FEMALE | .doubleBattle = FALSE, #line 13428 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, + .partySize = 1, .party = (const struct TrainerMon[]) { { @@ -33828,1306 +33662,1472 @@ F_TRAINER_FEMALE | .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, #line 13432 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 13431 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13434 + [TRAINER_GRUNT_MAGMA_HIDEOUT_13] = + { +#line 13435 + .trainerName = _("GRUNT"), +#line 13436 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 13437 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .encounterMusic_gender = +#line 13439 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13440 + .doubleBattle = FALSE, +#line 13441 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13443 + .species = SPECIES_ZUBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13445 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13444 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13447 + [TRAINER_GRUNT_MAGMA_HIDEOUT_14] = + { +#line 13448 + .trainerName = _("GRUNT"), +#line 13449 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 13450 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .encounterMusic_gender = +#line 13451 +F_TRAINER_FEMALE | +#line 13452 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13453 + .doubleBattle = FALSE, +#line 13454 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13456 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13458 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13457 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13460 + [TRAINER_GRUNT_MAGMA_HIDEOUT_15] = + { +#line 13461 + .trainerName = _("GRUNT"), +#line 13462 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 13463 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .encounterMusic_gender = +#line 13464 +F_TRAINER_FEMALE | +#line 13465 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13466 + .doubleBattle = FALSE, +#line 13467 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13469 + .species = SPECIES_NUMEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13471 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13470 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13473 + [TRAINER_GRUNT_MAGMA_HIDEOUT_16] = + { +#line 13474 + .trainerName = _("GRUNT"), +#line 13475 + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, +#line 13476 + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .encounterMusic_gender = +#line 13477 +F_TRAINER_FEMALE | +#line 13478 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13479 + .doubleBattle = FALSE, +#line 13480 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13482 + .species = SPECIES_BALTOY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13484 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13483 + .lvl = 29, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13486 + [TRAINER_TABITHA_MAGMA_HIDEOUT] = + { +#line 13487 + .trainerName = _("TABITHA"), +#line 13488 + .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, +#line 13489 + .trainerPic = TRAINER_PIC_MAGMA_ADMIN, + .encounterMusic_gender = +#line 13491 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13492 + .doubleBattle = FALSE, +#line 13493 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 4, + .party = (const struct TrainerMon[]) + { + { +#line 13495 + .species = SPECIES_NUMEL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13497 + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), +#line 13496 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13434 +#line 13499 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13436 +#line 13501 .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13435 +#line 13500 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13438 +#line 13503 .species = SPECIES_ZUBAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13440 +#line 13505 .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13439 +#line 13504 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13442 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13444 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13443 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13446 - [TRAINER_DARCY] = - { -#line 13447 - .trainerName = _("DARCY"), -#line 13448 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13449 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 13450 -F_TRAINER_FEMALE | -#line 13451 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13452 - .items = { ITEM_HYPER_POTION }, -#line 13453 - .doubleBattle = FALSE, -#line 13454 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13456 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13458 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13457 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13460 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13462 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13461 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13464 - [TRAINER_MAXIE_MOSSDEEP] = - { -#line 13465 - .trainerName = _("MAXIE"), -#line 13466 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 13467 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 13469 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13470 - .doubleBattle = FALSE, -#line 13471 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13473 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13475 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13474 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13477 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13479 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13478 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13481 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13483 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13482 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13485 - [TRAINER_PETE] = - { -#line 13486 - .trainerName = _("PETE"), -#line 13487 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 13488 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 13490 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13491 - .doubleBattle = FALSE, -#line 13492 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13494 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13496 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13495 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13498 - [TRAINER_ISABELLE] = - { -#line 13499 - .trainerName = _("ISABELLE"), -#line 13500 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 13501 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 13502 -F_TRAINER_FEMALE | -#line 13503 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13504 - .doubleBattle = FALSE, -#line 13505 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { #line 13507 - .species = SPECIES_MARILL, + .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, #line 13509 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), + .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), #line 13508 - .lvl = 15, + .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 13511 - [TRAINER_ANDRES_1] = + [TRAINER_DARCY] = { #line 13512 - .trainerName = _("ANDRES"), + .trainerName = _("DARCY"), #line 13513 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13514 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13516 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13517 - .doubleBattle = FALSE, -#line 13518 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13520 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13522 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13521 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13524 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13526 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13525 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13528 - [TRAINER_JOSUE] = - { -#line 13529 - .trainerName = _("JOSUE"), -#line 13530 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13531 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13533 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13534 - .doubleBattle = FALSE, -#line 13535 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13537 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13539 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13538 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13541 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13543 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13542 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13545 - [TRAINER_CAMRON] = - { -#line 13546 - .trainerName = _("CAMRON"), -#line 13547 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13548 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 13550 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13551 - .doubleBattle = FALSE, -#line 13552 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13554 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13556 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13555 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13558 - [TRAINER_CORY_1] = - { -#line 13559 - .trainerName = _("CORY"), -#line 13560 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 13561 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 13563 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13564 - .doubleBattle = FALSE, -#line 13565 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13567 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13569 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13568 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13571 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13573 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13572 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13575 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13577 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13576 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13579 - [TRAINER_CAROLINA] = - { -#line 13580 - .trainerName = _("CAROLINA"), -#line 13581 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13582 +#line 13514 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 13583 +#line 13515 F_TRAINER_FEMALE | -#line 13584 +#line 13516 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13585 +#line 13517 .items = { ITEM_HYPER_POTION }, -#line 13586 +#line 13518 .doubleBattle = FALSE, -#line 13587 +#line 13519 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13521 + .species = SPECIES_PELIPPER, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13523 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13522 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13525 + .species = SPECIES_CAMERUPT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13527 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13526 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13529 + [TRAINER_MAXIE_MOSSDEEP] = + { +#line 13530 + .trainerName = _("MAXIE"), +#line 13531 + .trainerClass = TRAINER_CLASS_MAGMA_LEADER, +#line 13532 + .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, + .encounterMusic_gender = +#line 13534 + TRAINER_ENCOUNTER_MUSIC_MAGMA, +#line 13535 + .doubleBattle = FALSE, +#line 13536 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { +#line 13538 + .species = SPECIES_MIGHTYENA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13540 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 13539 + .lvl = 42, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13542 + .species = SPECIES_CROBAT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13544 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 13543 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13546 + .species = SPECIES_CAMERUPT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13548 + .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), +#line 13547 + .lvl = 44, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13550 + [TRAINER_PETE] = + { +#line 13551 + .trainerName = _("PETE"), +#line 13552 + .trainerClass = TRAINER_CLASS_SWIMMER_M, +#line 13553 + .trainerPic = TRAINER_PIC_SWIMMER_M, + .encounterMusic_gender = +#line 13555 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 13556 + .doubleBattle = FALSE, +#line 13557 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13559 + .species = SPECIES_TENTACOOL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13561 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13560 + .lvl = 15, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13563 + [TRAINER_ISABELLE] = + { +#line 13564 + .trainerName = _("ISABELLE"), +#line 13565 + .trainerClass = TRAINER_CLASS_SWIMMER_F, +#line 13566 + .trainerPic = TRAINER_PIC_SWIMMER_F, + .encounterMusic_gender = +#line 13567 +F_TRAINER_FEMALE | +#line 13568 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 13569 + .doubleBattle = FALSE, +#line 13570 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13572 + .species = SPECIES_MARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13574 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13573 + .lvl = 15, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13576 + [TRAINER_ANDRES_1] = + { +#line 13577 + .trainerName = _("ANDRES"), +#line 13578 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 13579 + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .encounterMusic_gender = +#line 13581 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 13582 + .doubleBattle = FALSE, +#line 13583 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13585 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13587 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13586 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 13589 - .species = SPECIES_MANECTRIC, + .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, #line 13591 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), #line 13590 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13593 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13595 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13594 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13597 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13599 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13598 - .lvl = 24, + .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13601 - [TRAINER_ELIJAH] = +#line 13593 + [TRAINER_JOSUE] = { -#line 13602 - .trainerName = _("ELIJAH"), -#line 13603 +#line 13594 + .trainerName = _("JOSUE"), +#line 13595 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13604 +#line 13596 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 13606 +#line 13598 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13607 +#line 13599 .doubleBattle = FALSE, -#line 13608 +#line 13600 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13610 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13612 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13611 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13614 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13616 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13615 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13618 - [TRAINER_CELIA] = - { -#line 13619 - .trainerName = _("CELIA"), -#line 13620 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13621 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13622 -F_TRAINER_FEMALE | -#line 13623 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13624 - .doubleBattle = FALSE, -#line 13625 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13627 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13629 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13628 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13631 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13633 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13632 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13635 - [TRAINER_BRYAN] = - { -#line 13636 - .trainerName = _("BRYAN"), -#line 13637 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13638 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13640 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13641 - .doubleBattle = FALSE, -#line 13642 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13644 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13646 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13645 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13648 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13650 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13649 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13652 - [TRAINER_BRANDEN] = - { -#line 13653 - .trainerName = _("BRANDEN"), -#line 13654 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13655 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13657 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13658 - .doubleBattle = FALSE, -#line 13659 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13661 +#line 13602 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13663 +#line 13604 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13603 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13606 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13608 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13607 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13610 + [TRAINER_CAMRON] = + { +#line 13611 + .trainerName = _("CAMRON"), +#line 13612 + .trainerClass = TRAINER_CLASS_TRIATHLETE, +#line 13613 + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .encounterMusic_gender = +#line 13615 + TRAINER_ENCOUNTER_MUSIC_SWIMMER, +#line 13616 + .doubleBattle = FALSE, +#line 13617 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 13619 + .species = SPECIES_STARYU, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13621 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13620 + .lvl = 26, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13623 + [TRAINER_CORY_1] = + { +#line 13624 + .trainerName = _("CORY"), +#line 13625 + .trainerClass = TRAINER_CLASS_SAILOR, +#line 13626 + .trainerPic = TRAINER_PIC_SAILOR, + .encounterMusic_gender = +#line 13628 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 13629 + .doubleBattle = FALSE, +#line 13630 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 13632 + .species = SPECIES_WINGULL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13634 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13633 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13636 + .species = SPECIES_MACHOP, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13638 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13637 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13640 + .species = SPECIES_TENTACOOL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13642 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13641 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13644 + [TRAINER_CAROLINA] = + { +#line 13645 + .trainerName = _("CAROLINA"), +#line 13646 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 13647 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 13648 +F_TRAINER_FEMALE | +#line 13649 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 13650 + .items = { ITEM_HYPER_POTION }, +#line 13651 + .doubleBattle = FALSE, +#line 13652 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 13654 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13656 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13655 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13658 + .species = SPECIES_SWELLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13660 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13659 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 13662 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13664 + .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), +#line 13663 + .lvl = 24, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13666 + [TRAINER_ELIJAH] = + { +#line 13667 + .trainerName = _("ELIJAH"), +#line 13668 + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, +#line 13669 + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .encounterMusic_gender = +#line 13671 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 13672 + .doubleBattle = FALSE, +#line 13673 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13675 + .species = SPECIES_SKARMORY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13677 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13676 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13679 + .species = SPECIES_SKARMORY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13681 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13680 + .lvl = 25, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13683 + [TRAINER_CELIA] = + { +#line 13684 + .trainerName = _("CELIA"), +#line 13685 + .trainerClass = TRAINER_CLASS_PICNICKER, +#line 13686 + .trainerPic = TRAINER_PIC_PICNICKER, + .encounterMusic_gender = +#line 13687 +F_TRAINER_FEMALE | +#line 13688 + TRAINER_ENCOUNTER_MUSIC_GIRL, +#line 13689 + .doubleBattle = FALSE, +#line 13690 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13692 + .species = SPECIES_MARILL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13694 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13693 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13665 +#line 13696 + .species = SPECIES_LOMBRE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13698 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13697 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13700 + [TRAINER_BRYAN] = + { +#line 13701 + .trainerName = _("BRYAN"), +#line 13702 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 13703 + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .encounterMusic_gender = +#line 13705 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 13706 + .doubleBattle = FALSE, +#line 13707 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13709 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13711 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13710 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13713 + .species = SPECIES_SANDSLASH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13715 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13714 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 13717 + [TRAINER_BRANDEN] = + { +#line 13718 + .trainerName = _("BRANDEN"), +#line 13719 + .trainerClass = TRAINER_CLASS_CAMPER, +#line 13720 + .trainerPic = TRAINER_PIC_CAMPER, + .encounterMusic_gender = +#line 13722 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 13723 + .doubleBattle = FALSE, +#line 13724 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 13726 + .species = SPECIES_TAILLOW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 13728 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 13727 + .lvl = 22, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 13730 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13667 +#line 13732 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13666 +#line 13731 .lvl = 22, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13669 +#line 13734 [TRAINER_BRYANT] = { -#line 13670 +#line 13735 .trainerName = _("BRYANT"), -#line 13671 +#line 13736 .trainerClass = TRAINER_CLASS_KINDLER, -#line 13672 +#line 13737 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 13674 +#line 13739 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13675 +#line 13740 .doubleBattle = FALSE, -#line 13676 +#line 13741 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13678 +#line 13743 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13680 +#line 13745 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13679 +#line 13744 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13682 +#line 13747 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13684 +#line 13749 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13683 +#line 13748 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13686 +#line 13751 [TRAINER_SHAYLA] = { -#line 13687 +#line 13752 .trainerName = _("SHAYLA"), -#line 13688 +#line 13753 .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13689 +#line 13754 .trainerPic = TRAINER_PIC_AROMA_LADY, .encounterMusic_gender = -#line 13690 +#line 13755 F_TRAINER_FEMALE | -#line 13691 +#line 13756 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13692 +#line 13757 .doubleBattle = FALSE, -#line 13693 +#line 13758 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13695 +#line 13760 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13697 +#line 13762 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13696 +#line 13761 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13699 +#line 13764 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13701 +#line 13766 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13700 +#line 13765 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13703 +#line 13768 [TRAINER_KYRA] = { -#line 13704 +#line 13769 .trainerName = _("KYRA"), -#line 13705 +#line 13770 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13706 +#line 13771 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = -#line 13707 +#line 13772 F_TRAINER_FEMALE | -#line 13708 +#line 13773 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13709 +#line 13774 .doubleBattle = FALSE, -#line 13710 +#line 13775 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13712 +#line 13777 .species = SPECIES_DODUO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13714 +#line 13779 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13713 +#line 13778 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13716 +#line 13781 .species = SPECIES_DODRIO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13718 +#line 13783 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13717 +#line 13782 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13720 +#line 13785 [TRAINER_JAIDEN] = { -#line 13721 +#line 13786 .trainerName = _("JAIDEN"), -#line 13722 +#line 13787 .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 13723 +#line 13788 .trainerPic = TRAINER_PIC_NINJA_BOY, .encounterMusic_gender = -#line 13725 +#line 13790 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13726 +#line 13791 .doubleBattle = FALSE, -#line 13727 +#line 13792 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13729 +#line 13794 .species = SPECIES_NINJASK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13731 +#line 13796 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13730 +#line 13795 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13733 +#line 13798 .species = SPECIES_GULPIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13735 +#line 13800 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13734 +#line 13799 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13737 +#line 13802 [TRAINER_ALIX] = { -#line 13738 +#line 13803 .trainerName = _("ALIX"), -#line 13739 +#line 13804 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13740 +#line 13805 .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 13741 +#line 13806 F_TRAINER_FEMALE | -#line 13742 +#line 13807 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13743 +#line 13808 .doubleBattle = FALSE, -#line 13744 +#line 13809 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13746 +#line 13811 .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13748 +#line 13813 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13747 +#line 13812 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13750 +#line 13815 .species = SPECIES_KIRLIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13752 +#line 13817 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13751 +#line 13816 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13754 +#line 13819 [TRAINER_HELENE] = { -#line 13755 +#line 13820 .trainerName = _("HELENE"), -#line 13756 +#line 13821 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13757 +#line 13822 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 13758 +#line 13823 F_TRAINER_FEMALE | -#line 13759 +#line 13824 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13760 +#line 13825 .doubleBattle = FALSE, -#line 13761 +#line 13826 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13763 +#line 13828 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13765 +#line 13830 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13764 +#line 13829 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13767 +#line 13832 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13769 +#line 13834 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13768 +#line 13833 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13771 +#line 13836 [TRAINER_MARLENE] = { -#line 13772 +#line 13837 .trainerName = _("MARLENE"), -#line 13773 +#line 13838 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13774 +#line 13839 .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 13775 +#line 13840 F_TRAINER_FEMALE | -#line 13776 +#line 13841 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13777 +#line 13842 .doubleBattle = FALSE, -#line 13778 +#line 13843 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13780 +#line 13845 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13782 +#line 13847 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13781 +#line 13846 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13784 +#line 13849 .species = SPECIES_SPOINK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13786 +#line 13851 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13785 +#line 13850 .lvl = 18, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13788 +#line 13853 [TRAINER_DEVAN] = { -#line 13789 +#line 13854 .trainerName = _("DEVAN"), -#line 13790 +#line 13855 .trainerClass = TRAINER_CLASS_HIKER, -#line 13791 +#line 13856 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 13793 +#line 13858 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13794 +#line 13859 .doubleBattle = FALSE, -#line 13795 +#line 13860 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13797 +#line 13862 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13799 +#line 13864 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13798 +#line 13863 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13801 +#line 13866 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13803 +#line 13868 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13802 +#line 13867 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13805 +#line 13870 [TRAINER_JOHNSON] = { -#line 13806 +#line 13871 .trainerName = _("JOHNSON"), -#line 13807 +#line 13872 .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13808 +#line 13873 .trainerPic = TRAINER_PIC_YOUNGSTER, .encounterMusic_gender = -#line 13810 +#line 13875 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13811 +#line 13876 .doubleBattle = FALSE, -#line 13812 +#line 13877 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13814 +#line 13879 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13816 +#line 13881 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13815 +#line 13880 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13818 +#line 13883 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13820 +#line 13885 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13819 +#line 13884 .lvl = 8, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13822 +#line 13887 [TRAINER_MELINA] = { -#line 13823 +#line 13888 .trainerName = _("MELINA"), -#line 13824 +#line 13889 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13825 +#line 13890 .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, .encounterMusic_gender = -#line 13826 +#line 13891 F_TRAINER_FEMALE | -#line 13827 +#line 13892 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13828 +#line 13893 .doubleBattle = FALSE, -#line 13829 +#line 13894 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13831 +#line 13896 .species = SPECIES_DODUO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13833 +#line 13898 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13832 +#line 13897 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13835 +#line 13900 [TRAINER_BRANDI] = { -#line 13836 +#line 13901 .trainerName = _("BRANDI"), -#line 13837 +#line 13902 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13838 +#line 13903 .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 13839 +#line 13904 F_TRAINER_FEMALE | -#line 13840 +#line 13905 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13841 +#line 13906 .doubleBattle = FALSE, -#line 13842 +#line 13907 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13844 +#line 13909 .species = SPECIES_RALTS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13846 +#line 13911 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13845 +#line 13910 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13848 +#line 13913 [TRAINER_AISHA] = { -#line 13849 +#line 13914 .trainerName = _("AISHA"), -#line 13850 +#line 13915 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13851 +#line 13916 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 13852 +#line 13917 F_TRAINER_FEMALE | -#line 13853 +#line 13918 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13854 +#line 13919 .doubleBattle = FALSE, -#line 13855 +#line 13920 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13857 +#line 13922 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13859 +#line 13924 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13858 +#line 13923 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13861 +#line 13926 [TRAINER_MAKAYLA] = { -#line 13862 +#line 13927 .trainerName = _("MAKAYLA"), -#line 13863 +#line 13928 .trainerClass = TRAINER_CLASS_EXPERT, -#line 13864 +#line 13929 .trainerPic = TRAINER_PIC_EXPERT_F, .encounterMusic_gender = -#line 13865 +#line 13930 F_TRAINER_FEMALE | -#line 13866 +#line 13931 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13867 +#line 13932 .items = { ITEM_HYPER_POTION }, -#line 13868 +#line 13933 .doubleBattle = FALSE, -#line 13869 +#line 13934 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13871 +#line 13936 .species = SPECIES_ROSELIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13873 +#line 13938 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13872 +#line 13937 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13875 +#line 13940 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13877 +#line 13942 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13876 +#line 13941 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13879 +#line 13944 [TRAINER_FABIAN] = { -#line 13880 +#line 13945 .trainerName = _("FABIAN"), -#line 13881 +#line 13946 .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13882 +#line 13947 .trainerPic = TRAINER_PIC_GUITARIST, .encounterMusic_gender = -#line 13884 +#line 13949 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13885 +#line 13950 .doubleBattle = FALSE, -#line 13886 +#line 13951 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13888 +#line 13953 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13890 +#line 13955 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13889 +#line 13954 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13892 +#line 13957 [TRAINER_DAYTON] = { -#line 13893 +#line 13958 .trainerName = _("DAYTON"), -#line 13894 +#line 13959 .trainerClass = TRAINER_CLASS_KINDLER, -#line 13895 +#line 13960 .trainerPic = TRAINER_PIC_KINDLER, .encounterMusic_gender = -#line 13897 +#line 13962 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13898 +#line 13963 .doubleBattle = FALSE, -#line 13899 +#line 13964 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13901 +#line 13966 .species = SPECIES_SLUGMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13903 +#line 13968 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13902 +#line 13967 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13905 +#line 13970 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13907 +#line 13972 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13906 +#line 13971 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13909 +#line 13974 [TRAINER_RACHEL] = { -#line 13910 +#line 13975 .trainerName = _("RACHEL"), -#line 13911 +#line 13976 .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 13912 +#line 13977 .trainerPic = TRAINER_PIC_PARASOL_LADY, .encounterMusic_gender = -#line 13913 +#line 13978 F_TRAINER_FEMALE | -#line 13914 +#line 13979 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13915 +#line 13980 .doubleBattle = FALSE, -#line 13916 +#line 13981 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13918 +#line 13983 .species = SPECIES_GOLDEEN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13920 +#line 13985 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13919 +#line 13984 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13922 +#line 13987 [TRAINER_LEONEL] = { -#line 13923 +#line 13988 .trainerName = _("LEONEL"), -#line 13924 +#line 13989 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13925 +#line 13990 .trainerPic = TRAINER_PIC_COOLTRAINER_M, .encounterMusic_gender = -#line 13927 +#line 13992 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13928 +#line 13993 .items = { ITEM_HYPER_POTION }, -#line 13929 +#line 13994 .doubleBattle = FALSE, -#line 13930 +#line 13995 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 13932 +#line 13997 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13934 +#line 13999 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13933 +#line 13998 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 13935 +#line 14000 MOVE_THUNDER, MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, @@ -35135,442 +35135,442 @@ F_TRAINER_FEMALE | }, }, }, -#line 13939 +#line 14004 [TRAINER_CALLIE] = { -#line 13940 +#line 14005 .trainerName = _("CALLIE"), -#line 13941 +#line 14006 .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13942 +#line 14007 .trainerPic = TRAINER_PIC_BATTLE_GIRL, .encounterMusic_gender = -#line 13943 +#line 14008 F_TRAINER_FEMALE | -#line 13944 +#line 14009 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13945 +#line 14010 .doubleBattle = FALSE, -#line 13946 +#line 14011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13948 +#line 14013 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13950 +#line 14015 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13949 +#line 14014 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13952 +#line 14017 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13954 +#line 14019 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13953 +#line 14018 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13956 +#line 14021 [TRAINER_CALE] = { -#line 13957 +#line 14022 .trainerName = _("CALE"), -#line 13958 +#line 14023 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 13959 +#line 14024 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 13961 +#line 14026 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13962 +#line 14027 .doubleBattle = FALSE, -#line 13963 +#line 14028 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 13965 +#line 14030 .species = SPECIES_DUSTOX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13967 +#line 14032 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13966 +#line 14031 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13969 +#line 14034 .species = SPECIES_BEAUTIFLY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13971 +#line 14036 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13970 +#line 14035 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 13973 +#line 14038 [TRAINER_MYLES] = { -#line 13974 +#line 14039 .trainerName = _("MYLES"), -#line 13975 +#line 14040 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 13976 +#line 14041 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, .encounterMusic_gender = -#line 13978 +#line 14043 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13979 +#line 14044 .doubleBattle = FALSE, -#line 13980 +#line 14045 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 13982 +#line 14047 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13984 +#line 14049 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 13983 +#line 14048 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13986 +#line 14051 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13988 +#line 14053 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 13987 +#line 14052 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13990 +#line 14055 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13992 +#line 14057 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 13991 +#line 14056 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13994 +#line 14059 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 13996 +#line 14061 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 13995 +#line 14060 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 13998 +#line 14063 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14000 +#line 14065 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 13999 +#line 14064 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14002 +#line 14067 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14004 +#line 14069 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14003 +#line 14068 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 14006 +#line 14071 [TRAINER_PAT] = { -#line 14007 +#line 14072 .trainerName = _("PAT"), -#line 14008 +#line 14073 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 14009 +#line 14074 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 14010 +#line 14075 F_TRAINER_FEMALE | -#line 14011 +#line 14076 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14012 +#line 14077 .doubleBattle = FALSE, -#line 14013 +#line 14078 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14015 +#line 14080 .species = SPECIES_POOCHYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14017 +#line 14082 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14016 +#line 14081 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14019 +#line 14084 .species = SPECIES_SHROOMISH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14021 +#line 14086 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14020 +#line 14085 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14023 +#line 14088 .species = SPECIES_ELECTRIKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14025 +#line 14090 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14024 +#line 14089 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14027 +#line 14092 .species = SPECIES_MARILL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14029 +#line 14094 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14028 +#line 14093 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14031 +#line 14096 .species = SPECIES_SANDSHREW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14033 +#line 14098 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14032 +#line 14097 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14035 +#line 14100 .species = SPECIES_GULPIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14037 +#line 14102 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14036 +#line 14101 .lvl = 25, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 14039 +#line 14104 [TRAINER_CRISTIN_1] = { -#line 14040 +#line 14105 .trainerName = _("CRISTIN"), -#line 14041 +#line 14106 .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 14042 +#line 14107 .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = -#line 14043 +#line 14108 F_TRAINER_FEMALE | -#line 14044 +#line 14109 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 14045 +#line 14110 .items = { ITEM_HYPER_POTION }, -#line 14046 +#line 14111 .doubleBattle = FALSE, -#line 14047 +#line 14112 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 14049 +#line 14114 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14051 +#line 14116 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14050 +#line 14115 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14053 +#line 14118 .species = SPECIES_VIGOROTH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14055 +#line 14120 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14054 +#line 14119 .lvl = 29, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 14057 +#line 14122 [TRAINER_MAY_RUSTBORO_TREECKO] = { -#line 14058 +#line 14123 .trainerName = _("MAY"), -#line 14059 +#line 14124 .trainerClass = TRAINER_CLASS_RIVAL, -#line 14060 +#line 14125 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 14061 +#line 14126 F_TRAINER_FEMALE | -#line 14062 +#line 14127 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14063 +#line 14128 .doubleBattle = FALSE, -#line 14064 +#line 14129 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 14066 +#line 14131 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14068 +#line 14133 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14067 +#line 14132 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14070 +#line 14135 .species = SPECIES_TORCHIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14072 +#line 14137 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14071 +#line 14136 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 14074 +#line 14139 [TRAINER_MAY_RUSTBORO_TORCHIC] = { -#line 14075 +#line 14140 .trainerName = _("MAY"), -#line 14076 +#line 14141 .trainerClass = TRAINER_CLASS_RIVAL, -#line 14077 +#line 14142 .trainerPic = TRAINER_PIC_MAY, .encounterMusic_gender = -#line 14078 +#line 14143 F_TRAINER_FEMALE | -#line 14079 +#line 14144 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14080 +#line 14145 .doubleBattle = FALSE, -#line 14081 +#line 14146 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 14083 +#line 14148 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14085 +#line 14150 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14084 +#line 14149 .lvl = 13, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 14087 +#line 14152 .species = SPECIES_MUDKIP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14089 +#line 14154 .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14088 +#line 14153 .lvl = 15, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 14091 +#line 14156 [TRAINER_ROXANNE_2] = { -#line 14092 +#line 14157 .trainerName = _("ROXANNE"), -#line 14093 +#line 14158 .trainerClass = TRAINER_CLASS_LEADER, -#line 14094 +#line 14159 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = -#line 14095 +#line 14160 F_TRAINER_FEMALE | -#line 14096 +#line 14161 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14097 +#line 14162 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14098 +#line 14163 .doubleBattle = TRUE, -#line 14099 +#line 14164 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14101 +#line 14166 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14103 +#line 14168 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14102 +#line 14167 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14104 +#line 14169 MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, @@ -35578,19 +35578,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14109 +#line 14174 .species = SPECIES_KABUTO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14109 +#line 14174 .heldItem = ITEM_SITRUS_BERRY, -#line 14111 +#line 14176 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14110 +#line 14175 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14112 +#line 14177 MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, @@ -35598,17 +35598,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14117 +#line 14182 .species = SPECIES_ONIX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14119 +#line 14184 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14118 +#line 14183 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14120 +#line 14185 MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, @@ -35616,19 +35616,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14125 +#line 14190 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14125 +#line 14190 .heldItem = ITEM_SITRUS_BERRY, -#line 14127 +#line 14192 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14126 +#line 14191 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14128 +#line 14193 MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, @@ -35637,41 +35637,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14133 +#line 14198 [TRAINER_ROXANNE_3] = { -#line 14134 +#line 14199 .trainerName = _("ROXANNE"), -#line 14135 +#line 14200 .trainerClass = TRAINER_CLASS_LEADER, -#line 14136 +#line 14201 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = -#line 14137 +#line 14202 F_TRAINER_FEMALE | -#line 14138 +#line 14203 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14139 +#line 14204 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14140 +#line 14205 .doubleBattle = TRUE, -#line 14141 +#line 14206 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14143 +#line 14208 .species = SPECIES_OMANYTE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14145 +#line 14210 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14144 +#line 14209 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14146 +#line 14211 MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, @@ -35679,17 +35679,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14151 +#line 14216 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14153 +#line 14218 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14152 +#line 14217 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14154 +#line 14219 MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, @@ -35697,19 +35697,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14159 +#line 14224 .species = SPECIES_KABUTOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14159 +#line 14224 .heldItem = ITEM_SITRUS_BERRY, -#line 14161 +#line 14226 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14160 +#line 14225 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14162 +#line 14227 MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, @@ -35717,17 +35717,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14167 +#line 14232 .species = SPECIES_ONIX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14169 +#line 14234 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14168 +#line 14233 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14170 +#line 14235 MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, @@ -35735,19 +35735,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14175 +#line 14240 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14175 +#line 14240 .heldItem = ITEM_SITRUS_BERRY, -#line 14177 +#line 14242 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14176 +#line 14241 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14178 +#line 14243 MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, @@ -35756,41 +35756,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14183 +#line 14248 [TRAINER_ROXANNE_4] = { -#line 14184 +#line 14249 .trainerName = _("ROXANNE"), -#line 14185 +#line 14250 .trainerClass = TRAINER_CLASS_LEADER, -#line 14186 +#line 14251 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = -#line 14187 +#line 14252 F_TRAINER_FEMALE | -#line 14188 +#line 14253 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14189 +#line 14254 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14190 +#line 14255 .doubleBattle = TRUE, -#line 14191 +#line 14256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14193 +#line 14258 .species = SPECIES_OMASTAR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14195 +#line 14260 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14194 +#line 14259 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14196 +#line 14261 MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, @@ -35798,17 +35798,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14201 +#line 14266 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14203 +#line 14268 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14202 +#line 14267 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14204 +#line 14269 MOVE_PROTECT, MOVE_ROLLOUT, MOVE_EARTHQUAKE, @@ -35816,19 +35816,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14209 +#line 14274 .species = SPECIES_KABUTOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14209 +#line 14274 .heldItem = ITEM_SITRUS_BERRY, -#line 14211 +#line 14276 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14210 +#line 14275 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14212 +#line 14277 MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, @@ -35836,17 +35836,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14217 +#line 14282 .species = SPECIES_ONIX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14219 +#line 14284 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14218 +#line 14283 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14220 +#line 14285 MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, @@ -35854,19 +35854,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14225 +#line 14290 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14225 +#line 14290 .heldItem = ITEM_SITRUS_BERRY, -#line 14227 +#line 14292 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14226 +#line 14291 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14228 +#line 14293 MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, @@ -35875,41 +35875,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14233 +#line 14298 [TRAINER_ROXANNE_5] = { -#line 14234 +#line 14299 .trainerName = _("ROXANNE"), -#line 14235 +#line 14300 .trainerClass = TRAINER_CLASS_LEADER, -#line 14236 +#line 14301 .trainerPic = TRAINER_PIC_LEADER_ROXANNE, .encounterMusic_gender = -#line 14237 +#line 14302 F_TRAINER_FEMALE | -#line 14238 +#line 14303 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14239 +#line 14304 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14240 +#line 14305 .doubleBattle = TRUE, -#line 14241 +#line 14306 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14243 +#line 14308 .species = SPECIES_AERODACTYL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14245 +#line 14310 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14244 +#line 14309 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14246 +#line 14311 MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM, MOVE_SUPERSONIC, @@ -35917,17 +35917,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14251 +#line 14316 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14253 +#line 14318 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14252 +#line 14317 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14254 +#line 14319 MOVE_FOCUS_PUNCH, MOVE_ROLLOUT, MOVE_EARTHQUAKE, @@ -35935,17 +35935,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14259 +#line 14324 .species = SPECIES_OMASTAR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14261 +#line 14326 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14260 +#line 14325 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14262 +#line 14327 MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, @@ -35953,19 +35953,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14267 +#line 14332 .species = SPECIES_KABUTOPS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14267 +#line 14332 .heldItem = ITEM_SITRUS_BERRY, -#line 14269 +#line 14334 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14268 +#line 14333 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14270 +#line 14335 MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, @@ -35973,17 +35973,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14275 +#line 14340 .species = SPECIES_STEELIX, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14277 +#line 14342 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14276 +#line 14341 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14278 +#line 14343 MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, @@ -35991,19 +35991,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14283 +#line 14348 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14283 +#line 14348 .heldItem = ITEM_SITRUS_BERRY, -#line 14285 +#line 14350 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14284 +#line 14349 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14286 +#line 14351 MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, @@ -36012,41 +36012,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14291 +#line 14356 [TRAINER_BRAWLY_2] = { -#line 14292 +#line 14357 .trainerName = _("BRAWLY"), -#line 14293 +#line 14358 .trainerClass = TRAINER_CLASS_LEADER, -#line 14294 +#line 14359 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .encounterMusic_gender = -#line 14296 +#line 14361 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14297 +#line 14362 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14298 +#line 14363 .doubleBattle = TRUE, -#line 14299 +#line 14364 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14301 +#line 14366 .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14301 +#line 14366 .heldItem = ITEM_SITRUS_BERRY, -#line 14303 +#line 14368 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14302 +#line 14367 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14304 +#line 14369 MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, @@ -36054,17 +36054,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14309 +#line 14374 .species = SPECIES_MEDITITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14311 +#line 14376 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14310 +#line 14375 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14312 +#line 14377 MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, @@ -36072,17 +36072,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14317 +#line 14382 .species = SPECIES_HITMONTOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14319 +#line 14384 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14318 +#line 14383 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14320 +#line 14385 MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, @@ -36090,19 +36090,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14325 +#line 14390 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14325 +#line 14390 .heldItem = ITEM_SITRUS_BERRY, -#line 14327 +#line 14392 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14326 +#line 14391 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14328 +#line 14393 MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, @@ -36111,41 +36111,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14333 +#line 14398 [TRAINER_BRAWLY_3] = { -#line 14334 +#line 14399 .trainerName = _("BRAWLY"), -#line 14335 +#line 14400 .trainerClass = TRAINER_CLASS_LEADER, -#line 14336 +#line 14401 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .encounterMusic_gender = -#line 14338 +#line 14403 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14339 +#line 14404 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14340 +#line 14405 .doubleBattle = TRUE, -#line 14341 +#line 14406 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14343 +#line 14408 .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14343 +#line 14408 .heldItem = ITEM_SITRUS_BERRY, -#line 14345 +#line 14410 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14344 +#line 14409 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14346 +#line 14411 MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, @@ -36153,17 +36153,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14351 +#line 14416 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14353 +#line 14418 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14352 +#line 14417 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14354 +#line 14419 MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, @@ -36171,17 +36171,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14359 +#line 14424 .species = SPECIES_HITMONTOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14361 +#line 14426 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14360 +#line 14425 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14362 +#line 14427 MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, @@ -36189,19 +36189,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14367 +#line 14432 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14367 +#line 14432 .heldItem = ITEM_SITRUS_BERRY, -#line 14369 +#line 14434 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14368 +#line 14433 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14370 +#line 14435 MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, @@ -36210,39 +36210,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14375 +#line 14440 [TRAINER_BRAWLY_4] = { -#line 14376 +#line 14441 .trainerName = _("BRAWLY"), -#line 14377 +#line 14442 .trainerClass = TRAINER_CLASS_LEADER, -#line 14378 +#line 14443 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .encounterMusic_gender = -#line 14380 +#line 14445 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14381 +#line 14446 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14382 +#line 14447 .doubleBattle = TRUE, -#line 14383 +#line 14448 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14385 +#line 14450 .species = SPECIES_HITMONCHAN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14387 +#line 14452 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14386 +#line 14451 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14388 +#line 14453 MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, @@ -36250,19 +36250,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14393 +#line 14458 .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14393 +#line 14458 .heldItem = ITEM_SITRUS_BERRY, -#line 14395 +#line 14460 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14394 +#line 14459 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14396 +#line 14461 MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, @@ -36270,17 +36270,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14401 +#line 14466 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14403 +#line 14468 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14402 +#line 14467 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14404 +#line 14469 MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, @@ -36288,17 +36288,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14409 +#line 14474 .species = SPECIES_HITMONTOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14411 +#line 14476 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14410 +#line 14475 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14412 +#line 14477 MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, @@ -36306,19 +36306,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14417 +#line 14482 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14417 +#line 14482 .heldItem = ITEM_SITRUS_BERRY, -#line 14419 +#line 14484 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14418 +#line 14483 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14420 +#line 14485 MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, @@ -36327,39 +36327,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14425 +#line 14490 [TRAINER_BRAWLY_5] = { -#line 14426 +#line 14491 .trainerName = _("BRAWLY"), -#line 14427 +#line 14492 .trainerClass = TRAINER_CLASS_LEADER, -#line 14428 +#line 14493 .trainerPic = TRAINER_PIC_LEADER_BRAWLY, .encounterMusic_gender = -#line 14430 +#line 14495 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14431 +#line 14496 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14432 +#line 14497 .doubleBattle = TRUE, -#line 14433 +#line 14498 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14435 +#line 14500 .species = SPECIES_HITMONLEE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14437 +#line 14502 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14436 +#line 14501 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14438 +#line 14503 MOVE_MEGA_KICK, MOVE_FOCUS_PUNCH, MOVE_EARTHQUAKE, @@ -36367,17 +36367,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14443 +#line 14508 .species = SPECIES_HITMONCHAN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14445 +#line 14510 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14444 +#line 14509 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14446 +#line 14511 MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, @@ -36385,19 +36385,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14451 +#line 14516 .species = SPECIES_MACHAMP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14451 +#line 14516 .heldItem = ITEM_SITRUS_BERRY, -#line 14453 +#line 14518 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14452 +#line 14517 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14454 +#line 14519 MOVE_CROSS_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, @@ -36405,17 +36405,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14459 +#line 14524 .species = SPECIES_MEDICHAM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14461 +#line 14526 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14460 +#line 14525 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14462 +#line 14527 MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, @@ -36423,17 +36423,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14467 +#line 14532 .species = SPECIES_HITMONTOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14469 +#line 14534 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14468 +#line 14533 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14470 +#line 14535 MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, @@ -36441,19 +36441,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14475 +#line 14540 .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14475 +#line 14540 .heldItem = ITEM_SITRUS_BERRY, -#line 14477 +#line 14542 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14476 +#line 14541 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14478 +#line 14543 MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, @@ -36462,39 +36462,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14483 +#line 14548 [TRAINER_WATTSON_2] = { -#line 14484 +#line 14549 .trainerName = _("WATTSON"), -#line 14485 +#line 14550 .trainerClass = TRAINER_CLASS_LEADER, -#line 14486 +#line 14551 .trainerPic = TRAINER_PIC_LEADER_WATTSON, .encounterMusic_gender = -#line 14488 +#line 14553 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14489 +#line 14554 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14490 +#line 14555 .doubleBattle = TRUE, -#line 14491 +#line 14556 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14493 +#line 14558 .species = SPECIES_MAREEP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14495 +#line 14560 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14494 +#line 14559 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14496 +#line 14561 MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, @@ -36502,17 +36502,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14501 +#line 14566 .species = SPECIES_ELECTRODE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14503 +#line 14568 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14502 +#line 14567 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14504 +#line 14569 MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, @@ -36520,19 +36520,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14509 +#line 14574 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14509 +#line 14574 .heldItem = ITEM_SITRUS_BERRY, -#line 14511 +#line 14576 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14510 +#line 14575 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14512 +#line 14577 MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, @@ -36540,19 +36540,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14517 +#line 14582 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14517 +#line 14582 .heldItem = ITEM_SITRUS_BERRY, -#line 14519 +#line 14584 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14518 +#line 14583 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14520 +#line 14585 MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, @@ -36561,39 +36561,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14525 +#line 14590 [TRAINER_WATTSON_3] = { -#line 14526 +#line 14591 .trainerName = _("WATTSON"), -#line 14527 +#line 14592 .trainerClass = TRAINER_CLASS_LEADER, -#line 14528 +#line 14593 .trainerPic = TRAINER_PIC_LEADER_WATTSON, .encounterMusic_gender = -#line 14530 +#line 14595 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14531 +#line 14596 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14532 +#line 14597 .doubleBattle = TRUE, -#line 14533 +#line 14598 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14535 +#line 14600 .species = SPECIES_PIKACHU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14537 +#line 14602 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14536 +#line 14601 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14538 +#line 14603 MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, @@ -36601,17 +36601,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14543 +#line 14608 .species = SPECIES_FLAAFFY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14545 +#line 14610 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14544 +#line 14609 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14546 +#line 14611 MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, @@ -36619,17 +36619,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14551 +#line 14616 .species = SPECIES_ELECTRODE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14553 +#line 14618 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14552 +#line 14617 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14554 +#line 14619 MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, @@ -36637,19 +36637,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14559 +#line 14624 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14559 +#line 14624 .heldItem = ITEM_SITRUS_BERRY, -#line 14561 +#line 14626 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14560 +#line 14625 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14562 +#line 14627 MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, @@ -36657,19 +36657,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14567 +#line 14632 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14567 +#line 14632 .heldItem = ITEM_SITRUS_BERRY, -#line 14569 +#line 14634 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14568 +#line 14633 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14570 +#line 14635 MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, @@ -36678,39 +36678,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14575 +#line 14640 [TRAINER_WATTSON_4] = { -#line 14576 +#line 14641 .trainerName = _("WATTSON"), -#line 14577 +#line 14642 .trainerClass = TRAINER_CLASS_LEADER, -#line 14578 +#line 14643 .trainerPic = TRAINER_PIC_LEADER_WATTSON, .encounterMusic_gender = -#line 14580 +#line 14645 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14581 +#line 14646 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14582 +#line 14647 .doubleBattle = TRUE, -#line 14583 +#line 14648 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14585 +#line 14650 .species = SPECIES_RAICHU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14587 +#line 14652 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14586 +#line 14651 .lvl = 44, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14588 +#line 14653 MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, @@ -36718,17 +36718,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14593 +#line 14658 .species = SPECIES_AMPHAROS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14595 +#line 14660 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14594 +#line 14659 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14596 +#line 14661 MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, @@ -36736,17 +36736,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14601 +#line 14666 .species = SPECIES_ELECTRODE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14603 +#line 14668 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14602 +#line 14667 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14604 +#line 14669 MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, @@ -36754,19 +36754,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14609 +#line 14674 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14609 +#line 14674 .heldItem = ITEM_SITRUS_BERRY, -#line 14611 +#line 14676 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14610 +#line 14675 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14612 +#line 14677 MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, @@ -36774,19 +36774,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14617 +#line 14682 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14617 +#line 14682 .heldItem = ITEM_SITRUS_BERRY, -#line 14619 +#line 14684 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14618 +#line 14683 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14620 +#line 14685 MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, @@ -36795,39 +36795,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14625 +#line 14690 [TRAINER_WATTSON_5] = { -#line 14626 +#line 14691 .trainerName = _("WATTSON"), -#line 14627 +#line 14692 .trainerClass = TRAINER_CLASS_LEADER, -#line 14628 +#line 14693 .trainerPic = TRAINER_PIC_LEADER_WATTSON, .encounterMusic_gender = -#line 14630 +#line 14695 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14631 +#line 14696 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14632 +#line 14697 .doubleBattle = TRUE, -#line 14633 +#line 14698 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14635 +#line 14700 .species = SPECIES_ELECTABUZZ, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14637 +#line 14702 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14636 +#line 14701 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14638 +#line 14703 MOVE_SWIFT, MOVE_FOCUS_PUNCH, MOVE_THUNDER_PUNCH, @@ -36835,17 +36835,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14643 +#line 14708 .species = SPECIES_RAICHU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14645 +#line 14710 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14644 +#line 14709 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14646 +#line 14711 MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, @@ -36853,17 +36853,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14651 +#line 14716 .species = SPECIES_AMPHAROS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14653 +#line 14718 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14652 +#line 14717 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14654 +#line 14719 MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, @@ -36871,17 +36871,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14659 +#line 14724 .species = SPECIES_ELECTRODE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14661 +#line 14726 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14660 +#line 14725 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14662 +#line 14727 MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, @@ -36889,19 +36889,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14667 +#line 14732 .species = SPECIES_MAGNETON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14667 +#line 14732 .heldItem = ITEM_SITRUS_BERRY, -#line 14669 +#line 14734 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14668 +#line 14733 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14670 +#line 14735 MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, @@ -36909,19 +36909,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14675 +#line 14740 .species = SPECIES_MANECTRIC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14675 +#line 14740 .heldItem = ITEM_SITRUS_BERRY, -#line 14677 +#line 14742 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14676 +#line 14741 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14678 +#line 14743 MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, @@ -36930,43 +36930,43 @@ F_TRAINER_FEMALE | }, }, }, -#line 14683 +#line 14748 [TRAINER_FLANNERY_2] = { -#line 14684 +#line 14749 .trainerName = _("FLANNERY"), -#line 14685 +#line 14750 .trainerClass = TRAINER_CLASS_LEADER, -#line 14686 +#line 14751 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = -#line 14687 +#line 14752 F_TRAINER_FEMALE | -#line 14688 +#line 14753 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14689 +#line 14754 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14690 +#line 14755 .doubleBattle = TRUE, -#line 14691 +#line 14756 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14693 +#line 14758 .species = SPECIES_MAGCARGO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14693 +#line 14758 .heldItem = ITEM_WHITE_HERB, -#line 14695 +#line 14760 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14694 +#line 14759 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14696 +#line 14761 MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, @@ -36974,17 +36974,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14701 +#line 14766 .species = SPECIES_PONYTA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14703 +#line 14768 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14702 +#line 14767 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14704 +#line 14769 MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, @@ -36992,19 +36992,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14709 +#line 14774 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14709 +#line 14774 .heldItem = ITEM_WHITE_HERB, -#line 14711 +#line 14776 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14710 +#line 14775 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14712 +#line 14777 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, @@ -37012,19 +37012,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14717 +#line 14782 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14717 +#line 14782 .heldItem = ITEM_WHITE_HERB, -#line 14719 +#line 14784 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14718 +#line 14783 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14720 +#line 14785 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, @@ -37033,41 +37033,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14725 +#line 14790 [TRAINER_FLANNERY_3] = { -#line 14726 +#line 14791 .trainerName = _("FLANNERY"), -#line 14727 +#line 14792 .trainerClass = TRAINER_CLASS_LEADER, -#line 14728 +#line 14793 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = -#line 14729 +#line 14794 F_TRAINER_FEMALE | -#line 14730 +#line 14795 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14731 +#line 14796 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14732 +#line 14797 .doubleBattle = TRUE, -#line 14733 +#line 14798 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14735 +#line 14800 .species = SPECIES_GROWLITHE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14737 +#line 14802 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14736 +#line 14801 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14738 +#line 14803 MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_ROAR, @@ -37075,19 +37075,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14743 +#line 14808 .species = SPECIES_MAGCARGO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14743 +#line 14808 .heldItem = ITEM_WHITE_HERB, -#line 14745 +#line 14810 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14744 +#line 14809 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14746 +#line 14811 MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, @@ -37095,17 +37095,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14751 +#line 14816 .species = SPECIES_PONYTA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14753 +#line 14818 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14752 +#line 14817 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14754 +#line 14819 MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, @@ -37113,19 +37113,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14759 +#line 14824 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14759 +#line 14824 .heldItem = ITEM_WHITE_HERB, -#line 14761 +#line 14826 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14760 +#line 14825 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14762 +#line 14827 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, @@ -37133,19 +37133,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14767 +#line 14832 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14767 +#line 14832 .heldItem = ITEM_WHITE_HERB, -#line 14769 +#line 14834 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14768 +#line 14833 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14770 +#line 14835 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, @@ -37154,41 +37154,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14775 +#line 14840 [TRAINER_FLANNERY_4] = { -#line 14776 +#line 14841 .trainerName = _("FLANNERY"), -#line 14777 +#line 14842 .trainerClass = TRAINER_CLASS_LEADER, -#line 14778 +#line 14843 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = -#line 14779 +#line 14844 F_TRAINER_FEMALE | -#line 14780 +#line 14845 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14781 +#line 14846 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14782 +#line 14847 .doubleBattle = TRUE, -#line 14783 +#line 14848 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14785 +#line 14850 .species = SPECIES_HOUNDOUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14787 +#line 14852 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14786 +#line 14851 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14788 +#line 14853 MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, @@ -37196,17 +37196,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14793 +#line 14858 .species = SPECIES_GROWLITHE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14795 +#line 14860 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14794 +#line 14859 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14796 +#line 14861 MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, @@ -37214,19 +37214,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14801 +#line 14866 .species = SPECIES_MAGCARGO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14801 +#line 14866 .heldItem = ITEM_WHITE_HERB, -#line 14803 +#line 14868 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14802 +#line 14867 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14804 +#line 14869 MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, @@ -37234,17 +37234,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14809 +#line 14874 .species = SPECIES_RAPIDASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14811 +#line 14876 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14810 +#line 14875 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14812 +#line 14877 MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, @@ -37252,19 +37252,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14817 +#line 14882 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14817 +#line 14882 .heldItem = ITEM_WHITE_HERB, -#line 14819 +#line 14884 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14818 +#line 14883 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14820 +#line 14885 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, @@ -37272,19 +37272,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14825 +#line 14890 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14825 +#line 14890 .heldItem = ITEM_WHITE_HERB, -#line 14827 +#line 14892 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14826 +#line 14891 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14828 +#line 14893 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, @@ -37293,41 +37293,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14833 +#line 14898 [TRAINER_FLANNERY_5] = { -#line 14834 +#line 14899 .trainerName = _("FLANNERY"), -#line 14835 +#line 14900 .trainerClass = TRAINER_CLASS_LEADER, -#line 14836 +#line 14901 .trainerPic = TRAINER_PIC_LEADER_FLANNERY, .encounterMusic_gender = -#line 14837 +#line 14902 F_TRAINER_FEMALE | -#line 14838 +#line 14903 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14839 +#line 14904 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14840 +#line 14905 .doubleBattle = TRUE, -#line 14841 +#line 14906 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 14843 +#line 14908 .species = SPECIES_ARCANINE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14845 +#line 14910 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14844 +#line 14909 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14846 +#line 14911 MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, @@ -37335,19 +37335,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14851 +#line 14916 .species = SPECIES_MAGCARGO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14851 +#line 14916 .heldItem = ITEM_WHITE_HERB, -#line 14853 +#line 14918 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14852 +#line 14917 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14854 +#line 14919 MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, @@ -37355,17 +37355,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14859 +#line 14924 .species = SPECIES_HOUNDOOM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14861 +#line 14926 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14860 +#line 14925 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14862 +#line 14927 MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, @@ -37373,17 +37373,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14867 +#line 14932 .species = SPECIES_RAPIDASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14869 +#line 14934 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14868 +#line 14933 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14870 +#line 14935 MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, @@ -37391,19 +37391,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14875 +#line 14940 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14875 +#line 14940 .heldItem = ITEM_WHITE_HERB, -#line 14877 +#line 14942 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14876 +#line 14941 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14878 +#line 14943 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, @@ -37411,19 +37411,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14883 +#line 14948 .species = SPECIES_TORKOAL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14883 +#line 14948 .heldItem = ITEM_WHITE_HERB, -#line 14885 +#line 14950 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14884 +#line 14949 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14886 +#line 14951 MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, @@ -37432,39 +37432,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 14891 +#line 14956 [TRAINER_NORMAN_2] = { -#line 14892 +#line 14957 .trainerName = _("NORMAN"), -#line 14893 +#line 14958 .trainerClass = TRAINER_CLASS_LEADER, -#line 14894 +#line 14959 .trainerPic = TRAINER_PIC_LEADER_NORMAN, .encounterMusic_gender = -#line 14896 +#line 14961 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14897 +#line 14962 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14898 +#line 14963 .doubleBattle = TRUE, -#line 14899 +#line 14964 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 4, .party = (const struct TrainerMon[]) { { -#line 14901 +#line 14966 .species = SPECIES_CHANSEY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14903 +#line 14968 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14902 +#line 14967 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14904 +#line 14969 MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, @@ -37472,19 +37472,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14909 +#line 14974 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14909 +#line 14974 .heldItem = ITEM_SITRUS_BERRY, -#line 14911 +#line 14976 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14910 +#line 14975 .lvl = 42, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14912 +#line 14977 MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, @@ -37492,17 +37492,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14917 +#line 14982 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14919 +#line 14984 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14918 +#line 14983 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14920 +#line 14985 MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, @@ -37510,19 +37510,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14925 +#line 14990 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14925 +#line 14990 .heldItem = ITEM_SITRUS_BERRY, -#line 14927 +#line 14992 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14926 +#line 14991 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14928 +#line 14993 MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, @@ -37531,41 +37531,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14933 +#line 14998 [TRAINER_NORMAN_3] = { -#line 14934 +#line 14999 .trainerName = _("NORMAN"), -#line 14935 +#line 15000 .trainerClass = TRAINER_CLASS_LEADER, -#line 14936 +#line 15001 .trainerPic = TRAINER_PIC_LEADER_NORMAN, .encounterMusic_gender = -#line 14938 +#line 15003 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14939 +#line 15004 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14940 +#line 15005 .doubleBattle = TRUE, -#line 14941 +#line 15006 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14943 +#line 15008 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14943 +#line 15008 .heldItem = ITEM_SITRUS_BERRY, -#line 14945 +#line 15010 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14944 +#line 15009 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14946 +#line 15011 MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, @@ -37573,17 +37573,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14951 +#line 15016 .species = SPECIES_CHANSEY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14953 +#line 15018 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14952 +#line 15017 .lvl = 47, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14954 +#line 15019 MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, @@ -37591,17 +37591,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14959 +#line 15024 .species = SPECIES_KANGASKHAN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14961 +#line 15026 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14960 +#line 15025 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14962 +#line 15027 MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, @@ -37609,17 +37609,17 @@ F_TRAINER_FEMALE | }, }, { -#line 14967 +#line 15032 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14969 +#line 15034 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14968 +#line 15033 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14970 +#line 15035 MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, @@ -37627,19 +37627,19 @@ F_TRAINER_FEMALE | }, }, { -#line 14975 +#line 15040 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14975 +#line 15040 .heldItem = ITEM_SITRUS_BERRY, -#line 14977 +#line 15042 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14976 +#line 15041 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14978 +#line 15043 MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, @@ -37648,41 +37648,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 14983 +#line 15048 [TRAINER_NORMAN_4] = { -#line 14984 +#line 15049 .trainerName = _("NORMAN"), -#line 14985 +#line 15050 .trainerClass = TRAINER_CLASS_LEADER, -#line 14986 +#line 15051 .trainerPic = TRAINER_PIC_LEADER_NORMAN, .encounterMusic_gender = -#line 14988 +#line 15053 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14989 +#line 15054 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14990 +#line 15055 .doubleBattle = TRUE, -#line 14991 +#line 15056 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 14993 +#line 15058 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 14993 +#line 15058 .heldItem = ITEM_SITRUS_BERRY, -#line 14995 +#line 15060 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14994 +#line 15059 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 14996 +#line 15061 MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, @@ -37690,17 +37690,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15001 +#line 15066 .species = SPECIES_BLISSEY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15003 +#line 15068 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15002 +#line 15067 .lvl = 52, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15004 +#line 15069 MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, @@ -37708,17 +37708,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15009 +#line 15074 .species = SPECIES_KANGASKHAN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15011 +#line 15076 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15010 +#line 15075 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15012 +#line 15077 MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, @@ -37726,17 +37726,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15017 +#line 15082 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15019 +#line 15084 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15018 +#line 15083 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15020 +#line 15085 MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, @@ -37744,19 +37744,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15025 +#line 15090 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15025 +#line 15090 .heldItem = ITEM_SITRUS_BERRY, -#line 15027 +#line 15092 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15026 +#line 15091 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15028 +#line 15093 MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, @@ -37765,41 +37765,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 15033 +#line 15098 [TRAINER_NORMAN_5] = { -#line 15034 +#line 15099 .trainerName = _("NORMAN"), -#line 15035 +#line 15100 .trainerClass = TRAINER_CLASS_LEADER, -#line 15036 +#line 15101 .trainerPic = TRAINER_PIC_LEADER_NORMAN, .encounterMusic_gender = -#line 15038 +#line 15103 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15039 +#line 15104 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15040 +#line 15105 .doubleBattle = TRUE, -#line 15041 +#line 15106 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15043 +#line 15108 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15043 +#line 15108 .heldItem = ITEM_SITRUS_BERRY, -#line 15045 +#line 15110 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15044 +#line 15109 .lvl = 57, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15046 +#line 15111 MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, @@ -37807,17 +37807,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15051 +#line 15116 .species = SPECIES_BLISSEY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15053 +#line 15118 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15052 +#line 15117 .lvl = 57, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15054 +#line 15119 MOVE_PROTECT, MOVE_SING, MOVE_SKILL_SWAP, @@ -37825,17 +37825,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15059 +#line 15124 .species = SPECIES_KANGASKHAN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15061 +#line 15126 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15060 +#line 15125 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15062 +#line 15127 MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, @@ -37843,17 +37843,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15067 +#line 15132 .species = SPECIES_TAUROS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15069 +#line 15134 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15068 +#line 15133 .lvl = 57, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15070 +#line 15135 MOVE_TAKE_DOWN, MOVE_PROTECT, MOVE_FIRE_BLAST, @@ -37861,17 +37861,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15075 +#line 15140 .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15077 +#line 15142 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15076 +#line 15141 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15078 +#line 15143 MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, @@ -37879,19 +37879,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15083 +#line 15148 .species = SPECIES_SLAKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15083 +#line 15148 .heldItem = ITEM_SITRUS_BERRY, -#line 15085 +#line 15150 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15084 +#line 15149 .lvl = 60, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15086 +#line 15151 MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, @@ -37900,43 +37900,43 @@ F_TRAINER_FEMALE | }, }, }, -#line 15091 +#line 15156 [TRAINER_WINONA_2] = { -#line 15092 +#line 15157 .trainerName = _("WINONA"), -#line 15093 +#line 15158 .trainerClass = TRAINER_CLASS_LEADER, -#line 15094 +#line 15159 .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = -#line 15095 +#line 15160 F_TRAINER_FEMALE | -#line 15096 +#line 15161 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15097 +#line 15162 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15098 +#line 15163 .doubleBattle = TRUE, -#line 15099 +#line 15164 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 15101 +#line 15166 .species = SPECIES_DRATINI, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15101 +#line 15166 .heldItem = ITEM_SITRUS_BERRY, -#line 15103 +#line 15168 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15102 +#line 15167 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15104 +#line 15169 MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, @@ -37944,17 +37944,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15109 +#line 15174 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15111 +#line 15176 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15110 +#line 15175 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15112 +#line 15177 MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, @@ -37962,17 +37962,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15117 +#line 15182 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15119 +#line 15184 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15118 +#line 15183 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15120 +#line 15185 MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, @@ -37980,17 +37980,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15125 +#line 15190 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15127 +#line 15192 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15126 +#line 15191 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15128 +#line 15193 MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, @@ -37998,19 +37998,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15133 +#line 15198 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15133 +#line 15198 .heldItem = ITEM_CHESTO_BERRY, -#line 15135 +#line 15200 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15134 +#line 15199 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15136 +#line 15201 MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, @@ -38019,41 +38019,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 15141 +#line 15206 [TRAINER_WINONA_3] = { -#line 15142 +#line 15207 .trainerName = _("WINONA"), -#line 15143 +#line 15208 .trainerClass = TRAINER_CLASS_LEADER, -#line 15144 +#line 15209 .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = -#line 15145 +#line 15210 F_TRAINER_FEMALE | -#line 15146 +#line 15211 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15147 +#line 15212 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15148 +#line 15213 .doubleBattle = TRUE, -#line 15149 +#line 15214 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15151 +#line 15216 .species = SPECIES_HOOTHOOT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15153 +#line 15218 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15152 +#line 15217 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15154 +#line 15219 MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, @@ -38061,17 +38061,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15159 +#line 15224 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15161 +#line 15226 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15160 +#line 15225 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15162 +#line 15227 MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, @@ -38079,19 +38079,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15167 +#line 15232 .species = SPECIES_DRAGONAIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15167 +#line 15232 .heldItem = ITEM_SITRUS_BERRY, -#line 15169 +#line 15234 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15168 +#line 15233 .lvl = 45, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15170 +#line 15235 MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, @@ -38099,17 +38099,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15175 +#line 15240 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15177 +#line 15242 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15176 +#line 15241 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15178 +#line 15243 MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, @@ -38117,17 +38117,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15183 +#line 15248 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15185 +#line 15250 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15184 +#line 15249 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15186 +#line 15251 MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, @@ -38135,19 +38135,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15191 +#line 15256 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15191 +#line 15256 .heldItem = ITEM_CHESTO_BERRY, -#line 15193 +#line 15258 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15192 +#line 15257 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15194 +#line 15259 MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, @@ -38156,41 +38156,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 15199 +#line 15264 [TRAINER_WINONA_4] = { -#line 15200 +#line 15265 .trainerName = _("WINONA"), -#line 15201 +#line 15266 .trainerClass = TRAINER_CLASS_LEADER, -#line 15202 +#line 15267 .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = -#line 15203 +#line 15268 F_TRAINER_FEMALE | -#line 15204 +#line 15269 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15205 +#line 15270 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15206 +#line 15271 .doubleBattle = TRUE, -#line 15207 +#line 15272 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15209 +#line 15274 .species = SPECIES_NOCTOWL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15211 +#line 15276 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15210 +#line 15275 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15212 +#line 15277 MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, @@ -38198,17 +38198,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15217 +#line 15282 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15219 +#line 15284 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15218 +#line 15283 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15220 +#line 15285 MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, @@ -38216,19 +38216,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15225 +#line 15290 .species = SPECIES_DRAGONAIR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15225 +#line 15290 .heldItem = ITEM_SITRUS_BERRY, -#line 15227 +#line 15292 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15226 +#line 15291 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15228 +#line 15293 MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, @@ -38236,17 +38236,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15233 +#line 15298 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15235 +#line 15300 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15234 +#line 15299 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15236 +#line 15301 MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, @@ -38254,17 +38254,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15241 +#line 15306 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15243 +#line 15308 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15242 +#line 15307 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15244 +#line 15309 MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, @@ -38272,19 +38272,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15249 +#line 15314 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15249 +#line 15314 .heldItem = ITEM_CHESTO_BERRY, -#line 15251 +#line 15316 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15250 +#line 15315 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15252 +#line 15317 MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, @@ -38293,41 +38293,41 @@ F_TRAINER_FEMALE | }, }, }, -#line 15257 +#line 15322 [TRAINER_WINONA_5] = { -#line 15258 +#line 15323 .trainerName = _("WINONA"), -#line 15259 +#line 15324 .trainerClass = TRAINER_CLASS_LEADER, -#line 15260 +#line 15325 .trainerPic = TRAINER_PIC_LEADER_WINONA, .encounterMusic_gender = -#line 15261 +#line 15326 F_TRAINER_FEMALE | -#line 15262 +#line 15327 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15263 +#line 15328 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15264 +#line 15329 .doubleBattle = TRUE, -#line 15265 +#line 15330 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15267 +#line 15332 .species = SPECIES_NOCTOWL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15269 +#line 15334 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15268 +#line 15333 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15270 +#line 15335 MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, @@ -38335,17 +38335,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15275 +#line 15340 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15277 +#line 15342 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15276 +#line 15341 .lvl = 54, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15278 +#line 15343 MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, @@ -38353,17 +38353,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15283 +#line 15348 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15285 +#line 15350 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15284 +#line 15349 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15286 +#line 15351 MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, @@ -38371,19 +38371,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15291 +#line 15356 .species = SPECIES_DRAGONITE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15291 +#line 15356 .heldItem = ITEM_SITRUS_BERRY, -#line 15293 +#line 15358 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15292 +#line 15357 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15294 +#line 15359 MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, @@ -38391,17 +38391,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15299 +#line 15364 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15301 +#line 15366 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15300 +#line 15365 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15302 +#line 15367 MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, @@ -38409,19 +38409,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15307 +#line 15372 .species = SPECIES_ALTARIA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15307 +#line 15372 .heldItem = ITEM_CHESTO_BERRY, -#line 15309 +#line 15374 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15308 +#line 15373 .lvl = 60, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15310 +#line 15375 MOVE_SKY_ATTACK, MOVE_REST, MOVE_DRAGON_DANCE, @@ -38430,39 +38430,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15315 +#line 15380 [TRAINER_TATE_AND_LIZA_2] = { -#line 15316 +#line 15381 .trainerName = _("TATE&LIZA"), -#line 15317 +#line 15382 .trainerClass = TRAINER_CLASS_LEADER, -#line 15318 +#line 15383 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .encounterMusic_gender = -#line 15320 +#line 15385 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15321 +#line 15386 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15322 +#line 15387 .doubleBattle = TRUE, -#line 15323 +#line 15388 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 15325 +#line 15390 .species = SPECIES_SLOWPOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15327 +#line 15392 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15326 +#line 15391 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15328 +#line 15393 MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, @@ -38470,17 +38470,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15333 +#line 15398 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15335 +#line 15400 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15334 +#line 15399 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15336 +#line 15401 MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, @@ -38488,19 +38488,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15341 +#line 15406 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15341 +#line 15406 .heldItem = ITEM_CHESTO_BERRY, -#line 15343 +#line 15408 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15342 +#line 15407 .lvl = 49, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15344 +#line 15409 MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, @@ -38508,19 +38508,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15349 +#line 15414 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15349 +#line 15414 .heldItem = ITEM_CHESTO_BERRY, -#line 15351 +#line 15416 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15350 +#line 15415 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15352 +#line 15417 MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, @@ -38528,19 +38528,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15357 +#line 15422 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15357 +#line 15422 .heldItem = ITEM_SITRUS_BERRY, -#line 15359 +#line 15424 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15358 +#line 15423 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15360 +#line 15425 MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, @@ -38549,39 +38549,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15365 +#line 15430 [TRAINER_TATE_AND_LIZA_3] = { -#line 15366 +#line 15431 .trainerName = _("TATE&LIZA"), -#line 15367 +#line 15432 .trainerClass = TRAINER_CLASS_LEADER, -#line 15368 +#line 15433 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .encounterMusic_gender = -#line 15370 +#line 15435 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15371 +#line 15436 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15372 +#line 15437 .doubleBattle = TRUE, -#line 15373 +#line 15438 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15375 +#line 15440 .species = SPECIES_DROWZEE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15377 +#line 15442 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15376 +#line 15441 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15378 +#line 15443 MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, @@ -38589,17 +38589,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15383 +#line 15448 .species = SPECIES_SLOWPOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15385 +#line 15450 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15384 +#line 15449 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15386 +#line 15451 MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, @@ -38607,17 +38607,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15391 +#line 15456 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15393 +#line 15458 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15392 +#line 15457 .lvl = 54, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15394 +#line 15459 MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, @@ -38625,19 +38625,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15399 +#line 15464 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15399 +#line 15464 .heldItem = ITEM_CHESTO_BERRY, -#line 15401 +#line 15466 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15400 +#line 15465 .lvl = 54, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15402 +#line 15467 MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, @@ -38645,19 +38645,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15407 +#line 15472 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15407 +#line 15472 .heldItem = ITEM_CHESTO_BERRY, -#line 15409 +#line 15474 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15408 +#line 15473 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15410 +#line 15475 MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, @@ -38665,19 +38665,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15415 +#line 15480 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15415 +#line 15480 .heldItem = ITEM_SITRUS_BERRY, -#line 15417 +#line 15482 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15416 +#line 15481 .lvl = 55, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15418 +#line 15483 MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, @@ -38686,39 +38686,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15423 +#line 15488 [TRAINER_TATE_AND_LIZA_4] = { -#line 15424 +#line 15489 .trainerName = _("TATE&LIZA"), -#line 15425 +#line 15490 .trainerClass = TRAINER_CLASS_LEADER, -#line 15426 +#line 15491 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .encounterMusic_gender = -#line 15428 +#line 15493 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15429 +#line 15494 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15430 +#line 15495 .doubleBattle = TRUE, -#line 15431 +#line 15496 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15433 +#line 15498 .species = SPECIES_HYPNO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15435 +#line 15500 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15434 +#line 15499 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15436 +#line 15501 MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, @@ -38726,17 +38726,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15441 +#line 15506 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15443 +#line 15508 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15442 +#line 15507 .lvl = 59, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15444 +#line 15509 MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, @@ -38744,17 +38744,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15449 +#line 15514 .species = SPECIES_SLOWPOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15451 +#line 15516 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15450 +#line 15515 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15452 +#line 15517 MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, @@ -38762,19 +38762,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15457 +#line 15522 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15457 +#line 15522 .heldItem = ITEM_CHESTO_BERRY, -#line 15459 +#line 15524 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15458 +#line 15523 .lvl = 59, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15460 +#line 15525 MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, @@ -38782,19 +38782,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15465 +#line 15530 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15465 +#line 15530 .heldItem = ITEM_CHESTO_BERRY, -#line 15467 +#line 15532 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15466 +#line 15531 .lvl = 60, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15468 +#line 15533 MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, @@ -38802,19 +38802,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15473 +#line 15538 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15473 +#line 15538 .heldItem = ITEM_SITRUS_BERRY, -#line 15475 +#line 15540 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15474 +#line 15539 .lvl = 60, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15476 +#line 15541 MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, @@ -38823,39 +38823,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15481 +#line 15546 [TRAINER_TATE_AND_LIZA_5] = { -#line 15482 +#line 15547 .trainerName = _("TATE&LIZA"), -#line 15483 +#line 15548 .trainerClass = TRAINER_CLASS_LEADER, -#line 15484 +#line 15549 .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, .encounterMusic_gender = -#line 15486 +#line 15551 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15487 +#line 15552 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15488 +#line 15553 .doubleBattle = TRUE, -#line 15489 +#line 15554 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15491 +#line 15556 .species = SPECIES_HYPNO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15493 +#line 15558 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15492 +#line 15557 .lvl = 63, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15494 +#line 15559 MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, @@ -38863,17 +38863,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15499 +#line 15564 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15501 +#line 15566 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15500 +#line 15565 .lvl = 64, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15502 +#line 15567 MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, @@ -38881,17 +38881,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15507 +#line 15572 .species = SPECIES_SLOWKING, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15509 +#line 15574 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15508 +#line 15573 .lvl = 63, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15510 +#line 15575 MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, @@ -38899,19 +38899,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15515 +#line 15580 .species = SPECIES_XATU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15515 +#line 15580 .heldItem = ITEM_CHESTO_BERRY, -#line 15517 +#line 15582 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15516 +#line 15581 .lvl = 64, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15518 +#line 15583 MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, @@ -38919,19 +38919,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15523 +#line 15588 .species = SPECIES_LUNATONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15523 +#line 15588 .heldItem = ITEM_CHESTO_BERRY, -#line 15525 +#line 15590 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15524 +#line 15589 .lvl = 65, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15526 +#line 15591 MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, @@ -38939,19 +38939,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15531 +#line 15596 .species = SPECIES_SOLROCK, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15531 +#line 15596 .heldItem = ITEM_SITRUS_BERRY, -#line 15533 +#line 15598 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15532 +#line 15597 .lvl = 65, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15534 +#line 15599 MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, @@ -38960,39 +38960,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15539 +#line 15604 [TRAINER_JUAN_2] = { -#line 15540 +#line 15605 .trainerName = _("JUAN"), -#line 15541 +#line 15606 .trainerClass = TRAINER_CLASS_LEADER, -#line 15542 +#line 15607 .trainerPic = TRAINER_PIC_LEADER_JUAN, .encounterMusic_gender = -#line 15544 +#line 15609 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15545 +#line 15610 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15546 +#line 15611 .doubleBattle = TRUE, -#line 15547 +#line 15612 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 15549 +#line 15614 .species = SPECIES_POLIWAG, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15551 +#line 15616 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15550 +#line 15615 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15552 +#line 15617 MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, @@ -39000,17 +39000,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15557 +#line 15622 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15559 +#line 15624 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15558 +#line 15623 .lvl = 46, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15560 +#line 15625 MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, @@ -39018,17 +39018,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15565 +#line 15630 .species = SPECIES_WALREIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15567 +#line 15632 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15566 +#line 15631 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15568 +#line 15633 MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, @@ -39036,19 +39036,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15573 +#line 15638 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15573 +#line 15638 .heldItem = ITEM_CHESTO_BERRY, -#line 15575 +#line 15640 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15574 +#line 15639 .lvl = 48, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15576 +#line 15641 MOVE_REST, MOVE_CRABHAMMER, MOVE_TAUNT, @@ -39056,19 +39056,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15581 +#line 15646 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15581 +#line 15646 .heldItem = ITEM_CHESTO_BERRY, -#line 15583 +#line 15648 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15582 +#line 15647 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15584 +#line 15649 MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, @@ -39077,39 +39077,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15589 +#line 15654 [TRAINER_JUAN_3] = { -#line 15590 +#line 15655 .trainerName = _("JUAN"), -#line 15591 +#line 15656 .trainerClass = TRAINER_CLASS_LEADER, -#line 15592 +#line 15657 .trainerPic = TRAINER_PIC_LEADER_JUAN, .encounterMusic_gender = -#line 15594 +#line 15659 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15595 +#line 15660 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15596 +#line 15661 .doubleBattle = TRUE, -#line 15597 +#line 15662 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 5, .party = (const struct TrainerMon[]) { { -#line 15599 +#line 15664 .species = SPECIES_POLIWHIRL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15601 +#line 15666 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15600 +#line 15665 .lvl = 50, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15602 +#line 15667 MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, @@ -39117,17 +39117,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15607 +#line 15672 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15609 +#line 15674 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15608 +#line 15673 .lvl = 51, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15610 +#line 15675 MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, @@ -39135,17 +39135,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15615 +#line 15680 .species = SPECIES_WALREIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15617 +#line 15682 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15616 +#line 15681 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15618 +#line 15683 MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, @@ -39153,19 +39153,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15623 +#line 15688 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15623 +#line 15688 .heldItem = ITEM_CHESTO_BERRY, -#line 15625 +#line 15690 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15624 +#line 15689 .lvl = 53, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15626 +#line 15691 MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, @@ -39173,19 +39173,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15631 +#line 15696 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15631 +#line 15696 .heldItem = ITEM_CHESTO_BERRY, -#line 15633 +#line 15698 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15632 +#line 15697 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15634 +#line 15699 MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, @@ -39194,39 +39194,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15639 +#line 15704 [TRAINER_JUAN_4] = { -#line 15640 +#line 15705 .trainerName = _("JUAN"), -#line 15641 +#line 15706 .trainerClass = TRAINER_CLASS_LEADER, -#line 15642 +#line 15707 .trainerPic = TRAINER_PIC_LEADER_JUAN, .encounterMusic_gender = -#line 15644 +#line 15709 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15645 +#line 15710 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15646 +#line 15711 .doubleBattle = TRUE, -#line 15647 +#line 15712 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15649 +#line 15714 .species = SPECIES_LAPRAS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15651 +#line 15716 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15650 +#line 15715 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15652 +#line 15717 MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, @@ -39234,17 +39234,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15657 +#line 15722 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15659 +#line 15724 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15658 +#line 15723 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15660 +#line 15725 MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, @@ -39252,17 +39252,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15665 +#line 15730 .species = SPECIES_POLIWHIRL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15667 +#line 15732 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15666 +#line 15731 .lvl = 56, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15668 +#line 15733 MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, @@ -39270,17 +39270,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15673 +#line 15738 .species = SPECIES_WALREIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15675 +#line 15740 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15674 +#line 15739 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15676 +#line 15741 MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, @@ -39288,19 +39288,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15681 +#line 15746 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15681 +#line 15746 .heldItem = ITEM_CHESTO_BERRY, -#line 15683 +#line 15748 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15682 +#line 15747 .lvl = 58, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15684 +#line 15749 MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, @@ -39308,19 +39308,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15689 +#line 15754 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15689 +#line 15754 .heldItem = ITEM_CHESTO_BERRY, -#line 15691 +#line 15756 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15690 +#line 15755 .lvl = 61, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15692 +#line 15757 MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, @@ -39329,39 +39329,39 @@ F_TRAINER_FEMALE | }, }, }, -#line 15697 +#line 15762 [TRAINER_JUAN_5] = { -#line 15698 +#line 15763 .trainerName = _("JUAN"), -#line 15699 +#line 15764 .trainerClass = TRAINER_CLASS_LEADER, -#line 15700 +#line 15765 .trainerPic = TRAINER_PIC_LEADER_JUAN, .encounterMusic_gender = -#line 15702 +#line 15767 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15703 +#line 15768 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15704 +#line 15769 .doubleBattle = TRUE, -#line 15705 +#line 15770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15707 +#line 15772 .species = SPECIES_LAPRAS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15709 +#line 15774 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15708 +#line 15773 .lvl = 61, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15710 +#line 15775 MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, @@ -39369,17 +39369,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15715 +#line 15780 .species = SPECIES_WHISCASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15717 +#line 15782 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15716 +#line 15781 .lvl = 63, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15718 +#line 15783 MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, @@ -39387,17 +39387,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15723 +#line 15788 .species = SPECIES_POLITOED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15725 +#line 15790 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15724 +#line 15789 .lvl = 61, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15726 +#line 15791 MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_HYDRO_PUMP, @@ -39405,17 +39405,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15731 +#line 15796 .species = SPECIES_WALREIN, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15733 +#line 15798 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15732 +#line 15797 .lvl = 63, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15734 +#line 15799 MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, @@ -39423,19 +39423,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15739 +#line 15804 .species = SPECIES_CRAWDAUNT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15739 +#line 15804 .heldItem = ITEM_CHESTO_BERRY, -#line 15741 +#line 15806 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15740 +#line 15805 .lvl = 63, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15742 +#line 15807 MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, @@ -39443,19 +39443,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15747 +#line 15812 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15747 +#line 15812 .heldItem = ITEM_CHESTO_BERRY, -#line 15749 +#line 15814 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15748 +#line 15813 .lvl = 66, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15750 +#line 15815 MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, @@ -39464,54 +39464,54 @@ F_TRAINER_FEMALE | }, }, }, -#line 15755 +#line 15820 [TRAINER_ANGELO] = { -#line 15756 +#line 15821 .trainerName = _("ANGELO"), -#line 15757 +#line 15822 .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 15758 +#line 15823 .trainerPic = TRAINER_PIC_BUG_MANIAC, .encounterMusic_gender = -#line 15760 +#line 15825 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 15761 +#line 15826 .doubleBattle = FALSE, -#line 15762 +#line 15827 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 15764 +#line 15829 .species = SPECIES_ILLUMISE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15766 +#line 15831 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15765 +#line 15830 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15767 +#line 15832 MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CHARM, }, }, { -#line 15771 +#line 15836 .species = SPECIES_VOLBEAT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15773 +#line 15838 .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15772 +#line 15837 .lvl = 17, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15774 +#line 15839 MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CONFUSE_RAY, @@ -39519,71 +39519,71 @@ F_TRAINER_FEMALE | }, }, }, -#line 15778 +#line 15843 [TRAINER_DARIUS] = { -#line 15779 +#line 15844 .trainerName = _("DARIUS"), -#line 15780 +#line 15845 .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 15781 +#line 15846 .trainerPic = TRAINER_PIC_BIRD_KEEPER, .encounterMusic_gender = -#line 15783 +#line 15848 TRAINER_ENCOUNTER_MUSIC_COOL, -#line 15784 +#line 15849 .doubleBattle = FALSE, -#line 15785 +#line 15850 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 15787 +#line 15852 .species = SPECIES_TROPIUS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15789 +#line 15854 .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 15788 +#line 15853 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 15791 +#line 15856 [TRAINER_STEVEN] = { -#line 15792 +#line 15857 .trainerName = _("STEVEN"), -#line 15793 +#line 15858 .trainerClass = TRAINER_CLASS_RIVAL, -#line 15794 +#line 15859 .trainerPic = TRAINER_PIC_STEVEN, .encounterMusic_gender = -#line 15796 +#line 15861 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15797 +#line 15862 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15798 +#line 15863 .doubleBattle = FALSE, -#line 15799 +#line 15864 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 15801 +#line 15866 .species = SPECIES_SKARMORY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15803 +#line 15868 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15802 +#line 15867 .lvl = 77, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15804 +#line 15869 MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_SPIKES, @@ -39591,17 +39591,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15809 +#line 15874 .species = SPECIES_CLAYDOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15811 +#line 15876 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15810 +#line 15875 .lvl = 75, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15812 +#line 15877 MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_ANCIENT_POWER, @@ -39609,17 +39609,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15817 +#line 15882 .species = SPECIES_AGGRON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15819 +#line 15884 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15818 +#line 15883 .lvl = 76, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15820 +#line 15885 MOVE_THUNDER, MOVE_EARTHQUAKE, MOVE_SOLAR_BEAM, @@ -39627,17 +39627,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15825 +#line 15890 .species = SPECIES_CRADILY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15827 +#line 15892 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15826 +#line 15891 .lvl = 76, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15828 +#line 15893 MOVE_GIGA_DRAIN, MOVE_ANCIENT_POWER, MOVE_INGRAIN, @@ -39645,17 +39645,17 @@ F_TRAINER_FEMALE | }, }, { -#line 15833 +#line 15898 .species = SPECIES_ARMALDO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15835 +#line 15900 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15834 +#line 15899 .lvl = 76, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15836 +#line 15901 MOVE_WATER_PULSE, MOVE_ANCIENT_POWER, MOVE_AERIAL_ACE, @@ -39663,19 +39663,19 @@ F_TRAINER_FEMALE | }, }, { -#line 15841 +#line 15906 .species = SPECIES_METAGROSS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15841 +#line 15906 .heldItem = ITEM_SITRUS_BERRY, -#line 15843 +#line 15908 .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15842 +#line 15907 .lvl = 78, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, .moves = { -#line 15844 +#line 15909 MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_METEOR_MASH, @@ -39684,179 +39684,15 @@ F_TRAINER_FEMALE | }, }, }, -#line 15849 +#line 15914 [TRAINER_ANABEL] = { -#line 15850 - .trainerName = _("ANABEL"), -#line 15851 - .trainerClass = TRAINER_CLASS_SALON_MAIDEN, -#line 15852 - .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, - .encounterMusic_gender = -#line 15853 -F_TRAINER_FEMALE | -#line 15854 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15855 - .doubleBattle = FALSE, -#line 15856 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15858 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15860 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15859 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15862 - [TRAINER_TUCKER] = - { -#line 15863 - .trainerName = _("TUCKER"), -#line 15864 - .trainerClass = TRAINER_CLASS_DOME_ACE, -#line 15865 - .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, - .encounterMusic_gender = -#line 15867 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15868 - .doubleBattle = FALSE, -#line 15869 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15871 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15873 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15872 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15875 - [TRAINER_SPENSER] = - { -#line 15876 - .trainerName = _("SPENSER"), -#line 15877 - .trainerClass = TRAINER_CLASS_PALACE_MAVEN, -#line 15878 - .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, - .encounterMusic_gender = -#line 15880 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15881 - .doubleBattle = FALSE, -#line 15882 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15884 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15886 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15885 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15888 - [TRAINER_GRETA] = - { -#line 15889 - .trainerName = _("GRETA"), -#line 15890 - .trainerClass = TRAINER_CLASS_ARENA_TYCOON, -#line 15891 - .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, - .encounterMusic_gender = -#line 15892 -F_TRAINER_FEMALE | -#line 15893 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15894 - .doubleBattle = FALSE, -#line 15895 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15897 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15899 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15898 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15901 - [TRAINER_NOLAND] = - { -#line 15902 - .trainerName = _("NOLAND"), -#line 15903 - .trainerClass = TRAINER_CLASS_FACTORY_HEAD, -#line 15904 - .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, - .encounterMusic_gender = -#line 15906 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15907 - .doubleBattle = FALSE, -#line 15908 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15910 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15912 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15911 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15914 - [TRAINER_LUCY] = - { #line 15915 - .trainerName = _("LUCY"), + .trainerName = _("ANABEL"), #line 15916 - .trainerClass = TRAINER_CLASS_PIKE_QUEEN, + .trainerClass = TRAINER_CLASS_SALON_MAIDEN, #line 15917 - .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, + .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, .encounterMusic_gender = #line 15918 F_TRAINER_FEMALE | @@ -39883,14 +39719,14 @@ F_TRAINER_FEMALE | }, }, #line 15927 - [TRAINER_BRANDON] = + [TRAINER_TUCKER] = { #line 15928 - .trainerName = _("BRANDON"), + .trainerName = _("TUCKER"), #line 15929 - .trainerClass = TRAINER_CLASS_PYRAMID_KING, + .trainerClass = TRAINER_CLASS_DOME_ACE, #line 15930 - .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, + .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, .encounterMusic_gender = #line 15932 TRAINER_ENCOUNTER_MUSIC_MALE, @@ -39915,2268 +39751,2432 @@ F_TRAINER_FEMALE | }, }, #line 15940 - [TRAINER_ANDRES_2] = + [TRAINER_SPENSER] = { #line 15941 - .trainerName = _("ANDRES"), + .trainerName = _("SPENSER"), #line 15942 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerClass = TRAINER_CLASS_PALACE_MAVEN, #line 15943 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, .encounterMusic_gender = #line 15945 - TRAINER_ENCOUNTER_MUSIC_HIKER, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 15946 .doubleBattle = FALSE, #line 15947 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, .party = (const struct TrainerMon[]) { { #line 15949 - .species = SPECIES_SANDSHREW, + .species = SPECIES_BELDUM, .gender = TRAINER_MON_RANDOM_GENDER, #line 15951 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 15950 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 15953 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15955 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 15954 - .lvl = 31, + .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 15957 - [TRAINER_ANDRES_3] = +#line 15953 + [TRAINER_GRETA] = { -#line 15958 - .trainerName = _("ANDRES"), -#line 15959 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 15960 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, +#line 15954 + .trainerName = _("GRETA"), +#line 15955 + .trainerClass = TRAINER_CLASS_ARENA_TYCOON, +#line 15956 + .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, .encounterMusic_gender = -#line 15962 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 15963 +#line 15957 +F_TRAINER_FEMALE | +#line 15958 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 15959 .doubleBattle = FALSE, -#line 15964 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, +#line 15960 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 15966 - .species = SPECIES_NOSEPASS, +#line 15962 + .species = SPECIES_BELDUM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15968 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 15967 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 15970 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15972 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 15971 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 15974 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15976 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 15975 - .lvl = 33, +#line 15964 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 15963 + .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 15978 - [TRAINER_ANDRES_4] = +#line 15966 + [TRAINER_NOLAND] = { +#line 15967 + .trainerName = _("NOLAND"), +#line 15968 + .trainerClass = TRAINER_CLASS_FACTORY_HEAD, +#line 15969 + .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, + .encounterMusic_gender = +#line 15971 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 15972 + .doubleBattle = FALSE, +#line 15973 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 15975 + .species = SPECIES_BELDUM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 15977 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 15976 + .lvl = 5, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 15979 - .trainerName = _("ANDRES"), + [TRAINER_LUCY] = + { #line 15980 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .trainerName = _("LUCY"), #line 15981 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerClass = TRAINER_CLASS_PIKE_QUEEN, +#line 15982 + .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, .encounterMusic_gender = #line 15983 - TRAINER_ENCOUNTER_MUSIC_HIKER, +F_TRAINER_FEMALE | #line 15984 - .doubleBattle = FALSE, + TRAINER_ENCOUNTER_MUSIC_MALE, #line 15985 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, + .doubleBattle = FALSE, +#line 15986 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 15987 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15989 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 15988 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 15991 - .species = SPECIES_SANDSHREW, + .species = SPECIES_BELDUM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 15993 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 15992 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 15995 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15997 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 15996 - .lvl = 35, +#line 15990 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), +#line 15989 + .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 15999 - [TRAINER_ANDRES_5] = +#line 15992 + [TRAINER_BRANDON] = { -#line 16000 - .trainerName = _("ANDRES"), +#line 15993 + .trainerName = _("BRANDON"), +#line 15994 + .trainerClass = TRAINER_CLASS_PYRAMID_KING, +#line 15995 + .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, + .encounterMusic_gender = +#line 15997 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 15998 + .doubleBattle = FALSE, +#line 15999 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { #line 16001 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .species = SPECIES_BELDUM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16003 + .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), #line 16002 + .lvl = 5, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16005 + [TRAINER_ANDRES_2] = + { +#line 16006 + .trainerName = _("ANDRES"), +#line 16007 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 16008 .trainerPic = TRAINER_PIC_RUIN_MANIAC, .encounterMusic_gender = -#line 16004 +#line 16010 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16005 +#line 16011 .doubleBattle = FALSE, -#line 16006 +#line 16012 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 16014 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16016 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 16015 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16018 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16020 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 16019 + .lvl = 31, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16022 + [TRAINER_ANDRES_3] = + { +#line 16023 + .trainerName = _("ANDRES"), +#line 16024 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 16025 + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .encounterMusic_gender = +#line 16027 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 16028 + .doubleBattle = FALSE, +#line 16029 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16008 +#line 16031 .species = SPECIES_NOSEPASS, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16010 +#line 16033 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16032 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16035 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16037 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16036 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16039 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16041 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16040 + .lvl = 33, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16043 + [TRAINER_ANDRES_4] = + { +#line 16044 + .trainerName = _("ANDRES"), +#line 16045 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 16046 + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .encounterMusic_gender = +#line 16048 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 16049 + .doubleBattle = FALSE, +#line 16050 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16052 + .species = SPECIES_NOSEPASS, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16054 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16053 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16056 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16058 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16057 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16060 + .species = SPECIES_SANDSHREW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16062 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16061 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16064 + [TRAINER_ANDRES_5] = + { +#line 16065 + .trainerName = _("ANDRES"), +#line 16066 + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, +#line 16067 + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .encounterMusic_gender = +#line 16069 + TRAINER_ENCOUNTER_MUSIC_HIKER, +#line 16070 + .doubleBattle = FALSE, +#line 16071 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16073 + .species = SPECIES_NOSEPASS, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16075 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16009 +#line 16074 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16012 +#line 16077 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16014 +#line 16079 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16013 +#line 16078 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16016 +#line 16081 .species = SPECIES_SANDSLASH, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16018 +#line 16083 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16017 +#line 16082 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16020 +#line 16085 [TRAINER_CORY_2] = { -#line 16021 +#line 16086 .trainerName = _("CORY"), -#line 16022 +#line 16087 .trainerClass = TRAINER_CLASS_SAILOR, -#line 16023 +#line 16088 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 16025 +#line 16090 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16026 +#line 16091 .doubleBattle = FALSE, -#line 16027 +#line 16092 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16029 +#line 16094 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16031 +#line 16096 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16030 +#line 16095 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16033 +#line 16098 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16035 +#line 16100 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16034 +#line 16099 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16037 +#line 16102 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16039 +#line 16104 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16038 +#line 16103 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16041 +#line 16106 [TRAINER_CORY_3] = { -#line 16042 +#line 16107 .trainerName = _("CORY"), -#line 16043 +#line 16108 .trainerClass = TRAINER_CLASS_SAILOR, -#line 16044 +#line 16109 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 16046 +#line 16111 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16047 +#line 16112 .doubleBattle = FALSE, -#line 16048 +#line 16113 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16050 +#line 16115 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16052 +#line 16117 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16051 +#line 16116 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16054 +#line 16119 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16056 +#line 16121 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16055 +#line 16120 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16058 +#line 16123 .species = SPECIES_TENTACOOL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16060 +#line 16125 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16059 +#line 16124 .lvl = 32, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16062 +#line 16127 [TRAINER_CORY_4] = { -#line 16063 +#line 16128 .trainerName = _("CORY"), -#line 16064 +#line 16129 .trainerClass = TRAINER_CLASS_SAILOR, -#line 16065 +#line 16130 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 16067 +#line 16132 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16068 +#line 16133 .doubleBattle = FALSE, -#line 16069 +#line 16134 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16071 +#line 16136 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16073 +#line 16138 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16072 +#line 16137 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16075 +#line 16140 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16077 +#line 16142 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16076 +#line 16141 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16079 +#line 16144 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16081 +#line 16146 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16080 +#line 16145 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16083 +#line 16148 [TRAINER_CORY_5] = { -#line 16084 +#line 16149 .trainerName = _("CORY"), -#line 16085 +#line 16150 .trainerClass = TRAINER_CLASS_SAILOR, -#line 16086 +#line 16151 .trainerPic = TRAINER_PIC_SAILOR, .encounterMusic_gender = -#line 16088 +#line 16153 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16089 +#line 16154 .doubleBattle = FALSE, -#line 16090 +#line 16155 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16092 +#line 16157 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16094 +#line 16159 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16093 +#line 16158 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16096 +#line 16161 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16098 +#line 16163 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16097 +#line 16162 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16100 +#line 16165 .species = SPECIES_TENTACRUEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16102 +#line 16167 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16101 +#line 16166 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16104 +#line 16169 [TRAINER_PABLO_2] = { -#line 16105 +#line 16170 .trainerName = _("PABLO"), -#line 16106 +#line 16171 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16107 +#line 16172 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 16109 +#line 16174 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16110 +#line 16175 .doubleBattle = FALSE, -#line 16111 +#line 16176 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 16113 +#line 16178 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16115 +#line 16180 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16114 +#line 16179 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16117 +#line 16182 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16119 +#line 16184 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16118 +#line 16183 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16121 +#line 16186 [TRAINER_PABLO_3] = { -#line 16122 +#line 16187 .trainerName = _("PABLO"), -#line 16123 +#line 16188 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16124 +#line 16189 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 16126 +#line 16191 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16127 +#line 16192 .doubleBattle = FALSE, -#line 16128 +#line 16193 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16130 +#line 16195 .species = SPECIES_WINGULL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16132 +#line 16197 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16131 +#line 16196 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16134 +#line 16199 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16136 +#line 16201 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16135 +#line 16200 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16138 +#line 16203 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16140 +#line 16205 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16139 +#line 16204 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16142 +#line 16207 [TRAINER_PABLO_4] = { -#line 16143 +#line 16208 .trainerName = _("PABLO"), -#line 16144 +#line 16209 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16145 +#line 16210 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 16147 +#line 16212 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16148 +#line 16213 .doubleBattle = FALSE, -#line 16149 +#line 16214 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16151 +#line 16216 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16153 +#line 16218 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16152 +#line 16217 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16155 +#line 16220 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16157 +#line 16222 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16156 +#line 16221 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16159 +#line 16224 .species = SPECIES_STARYU, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16161 +#line 16226 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16160 +#line 16225 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16163 +#line 16228 [TRAINER_PABLO_5] = { -#line 16164 +#line 16229 .trainerName = _("PABLO"), -#line 16165 +#line 16230 .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16166 +#line 16231 .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, .encounterMusic_gender = -#line 16168 +#line 16233 TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16169 +#line 16234 .doubleBattle = FALSE, -#line 16170 +#line 16235 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16172 +#line 16237 .species = SPECIES_PELIPPER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16174 +#line 16239 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16173 +#line 16238 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16176 +#line 16241 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16178 +#line 16243 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16177 +#line 16242 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16180 +#line 16245 .species = SPECIES_STARMIE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16182 +#line 16247 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16181 +#line 16246 .lvl = 43, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16184 +#line 16249 [TRAINER_KOJI_2] = { -#line 16185 +#line 16250 .trainerName = _("KOJI"), -#line 16186 +#line 16251 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16187 +#line 16252 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 16189 +#line 16254 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16190 +#line 16255 .doubleBattle = FALSE, -#line 16191 +#line 16256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 16193 +#line 16258 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16195 +#line 16260 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16194 +#line 16259 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16197 +#line 16262 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16199 +#line 16264 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16198 +#line 16263 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16201 +#line 16266 [TRAINER_KOJI_3] = { -#line 16202 +#line 16267 .trainerName = _("KOJI"), -#line 16203 +#line 16268 .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16204 +#line 16269 .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 16206 +#line 16271 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16207 +#line 16272 .doubleBattle = FALSE, -#line 16208 +#line 16273 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16210 +#line 16275 .species = SPECIES_MAKUHITA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16212 +#line 16277 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16211 +#line 16276 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16214 +#line 16279 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16216 +#line 16281 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16215 +#line 16280 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16218 +#line 16283 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16220 +#line 16285 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16219 +#line 16284 .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16222 +#line 16287 [TRAINER_KOJI_4] = { -#line 16223 - .trainerName = _("KOJI"), -#line 16224 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16225 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16227 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16228 - .doubleBattle = FALSE, -#line 16229 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16231 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16233 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16232 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16235 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16237 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16236 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16239 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16241 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16240 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16243 - [TRAINER_KOJI_5] = - { -#line 16244 - .trainerName = _("KOJI"), -#line 16245 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16246 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16248 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16249 - .doubleBattle = FALSE, -#line 16250 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16252 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16254 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16253 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16256 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16258 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16257 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16260 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16262 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16261 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16264 - [TRAINER_CRISTIN_2] = - { -#line 16265 - .trainerName = _("CRISTIN"), -#line 16266 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16267 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16268 -F_TRAINER_FEMALE | -#line 16269 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16270 - .items = { ITEM_HYPER_POTION }, -#line 16271 - .doubleBattle = FALSE, -#line 16272 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16274 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16276 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16275 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16278 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16280 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16279 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16282 - [TRAINER_CRISTIN_3] = - { -#line 16283 - .trainerName = _("CRISTIN"), -#line 16284 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16285 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16286 -F_TRAINER_FEMALE | -#line 16287 - TRAINER_ENCOUNTER_MUSIC_COOL, #line 16288 - .items = { ITEM_HYPER_POTION }, + .trainerName = _("KOJI"), #line 16289 - .doubleBattle = FALSE, + .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16290 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .encounterMusic_gender = +#line 16292 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 16293 + .doubleBattle = FALSE, +#line 16294 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16292 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16294 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16293 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { #line 16296 - .species = SPECIES_LOUDRED, + .species = SPECIES_HARIYAMA, .gender = TRAINER_MON_RANDOM_GENDER, #line 16298 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 16297 - .lvl = 37, + .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 16300 - .species = SPECIES_VIGOROTH, + .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, #line 16302 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), #line 16301 - .lvl = 37, + .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, - }, - }, + { #line 16304 - [TRAINER_CRISTIN_4] = - { -#line 16305 - .trainerName = _("CRISTIN"), + .species = SPECIES_MACHOKE, + .gender = TRAINER_MON_RANDOM_GENDER, #line 16306 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16307 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16305 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, #line 16308 -F_TRAINER_FEMALE | + [TRAINER_KOJI_5] = + { #line 16309 - TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerName = _("KOJI"), #line 16310 - .items = { ITEM_HYPER_POTION }, + .trainerClass = TRAINER_CLASS_BLACK_BELT, #line 16311 - .doubleBattle = FALSE, -#line 16312 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16314 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16316 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16315 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16318 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16320 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16319 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16322 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16324 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 16323 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16326 - [TRAINER_CRISTIN_5] = - { -#line 16327 - .trainerName = _("CRISTIN"), -#line 16328 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16329 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .trainerPic = TRAINER_PIC_BLACK_BELT, .encounterMusic_gender = -#line 16330 -F_TRAINER_FEMALE | -#line 16331 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16332 - .items = { ITEM_HYPER_POTION }, -#line 16333 - .doubleBattle = FALSE, -#line 16334 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16336 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16338 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16337 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16340 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16342 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16341 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16344 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16346 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16345 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16348 - [TRAINER_FERNANDO_2] = - { -#line 16349 - .trainerName = _("FERNANDO"), -#line 16350 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16351 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16353 +#line 16313 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16354 +#line 16314 .doubleBattle = FALSE, -#line 16355 +#line 16315 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { +#line 16317 + .species = SPECIES_HARIYAMA, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16319 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16318 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16321 + .species = SPECIES_MACHAMP, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16323 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16322 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16325 + .species = SPECIES_MACHAMP, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16327 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16326 + .lvl = 43, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16329 + [TRAINER_CRISTIN_2] = + { +#line 16330 + .trainerName = _("CRISTIN"), +#line 16331 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 16332 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 16333 +F_TRAINER_FEMALE | +#line 16334 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 16335 + .items = { ITEM_HYPER_POTION }, +#line 16336 + .doubleBattle = FALSE, +#line 16337 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 16339 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16341 + .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), +#line 16340 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16343 + .species = SPECIES_VIGOROTH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16345 + .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), +#line 16344 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16347 + [TRAINER_CRISTIN_3] = + { +#line 16348 + .trainerName = _("CRISTIN"), +#line 16349 + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 16350 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, + .encounterMusic_gender = +#line 16351 +F_TRAINER_FEMALE | +#line 16352 + TRAINER_ENCOUNTER_MUSIC_COOL, +#line 16353 + .items = { ITEM_HYPER_POTION }, +#line 16354 + .doubleBattle = FALSE, +#line 16355 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { #line 16357 - .species = SPECIES_ELECTRIKE, + .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, #line 16359 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), #line 16358 - .lvl = 35, + .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 16361 - .species = SPECIES_ELECTRIKE, + .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, #line 16363 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), #line 16362 - .lvl = 35, + .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { #line 16365 - .species = SPECIES_LOUDRED, + .species = SPECIES_VIGOROTH, .gender = TRAINER_MON_RANDOM_GENDER, #line 16367 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), + .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), #line 16366 - .lvl = 35, + .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, #line 16369 - [TRAINER_FERNANDO_3] = + [TRAINER_CRISTIN_4] = { #line 16370 - .trainerName = _("FERNANDO"), + .trainerName = _("CRISTIN"), #line 16371 - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerClass = TRAINER_CLASS_COOLTRAINER, #line 16372 - .trainerPic = TRAINER_PIC_GUITARIST, + .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = +#line 16373 +F_TRAINER_FEMALE | #line 16374 - TRAINER_ENCOUNTER_MUSIC_INTENSE, + TRAINER_ENCOUNTER_MUSIC_COOL, #line 16375 - .doubleBattle = FALSE, + .items = { ITEM_HYPER_POTION }, #line 16376 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .doubleBattle = FALSE, +#line 16377 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16378 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16380 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), #line 16379 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16382 - .species = SPECIES_MANECTRIC, + .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16384 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16383 - .lvl = 37, +#line 16381 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 16380 + .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16386 +#line 16383 .species = SPECIES_LOUDRED, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16388 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16385 + .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), +#line 16384 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { #line 16387 - .lvl = 37, + .species = SPECIES_VIGOROTH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16389 + .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), +#line 16388 + .lvl = 39, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16390 - [TRAINER_FERNANDO_4] = - { #line 16391 - .trainerName = _("FERNANDO"), + [TRAINER_CRISTIN_5] = + { #line 16392 - .trainerClass = TRAINER_CLASS_GUITARIST, + .trainerName = _("CRISTIN"), #line 16393 - .trainerPic = TRAINER_PIC_GUITARIST, + .trainerClass = TRAINER_CLASS_COOLTRAINER, +#line 16394 + .trainerPic = TRAINER_PIC_COOLTRAINER_F, .encounterMusic_gender = #line 16395 - TRAINER_ENCOUNTER_MUSIC_INTENSE, +F_TRAINER_FEMALE | #line 16396 - .doubleBattle = FALSE, + TRAINER_ENCOUNTER_MUSIC_COOL, #line 16397 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16399 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16401 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16400 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16403 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16405 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16404 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16407 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16409 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16408 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16411 - [TRAINER_FERNANDO_5] = - { -#line 16412 - .trainerName = _("FERNANDO"), -#line 16413 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16414 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16416 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16417 + .items = { ITEM_HYPER_POTION }, +#line 16398 .doubleBattle = FALSE, -#line 16418 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, +#line 16399 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16420 - .species = SPECIES_MANECTRIC, +#line 16401 + .species = SPECIES_SPINDA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16422 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16421 +#line 16403 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 16402 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16424 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16426 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16425 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16428 +#line 16405 .species = SPECIES_EXPLOUD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16430 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16429 +#line 16407 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 16406 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16409 + .species = SPECIES_SLAKING, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16411 + .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), +#line 16410 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, +#line 16413 + [TRAINER_FERNANDO_2] = + { +#line 16414 + .trainerName = _("FERNANDO"), +#line 16415 + .trainerClass = TRAINER_CLASS_GUITARIST, +#line 16416 + .trainerPic = TRAINER_PIC_GUITARIST, + .encounterMusic_gender = +#line 16418 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 16419 + .doubleBattle = FALSE, +#line 16420 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16422 + .species = SPECIES_ELECTRIKE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16424 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 16423 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16426 + .species = SPECIES_ELECTRIKE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16428 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 16427 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16430 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, #line 16432 + .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), +#line 16431 + .lvl = 35, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16434 + [TRAINER_FERNANDO_3] = + { +#line 16435 + .trainerName = _("FERNANDO"), +#line 16436 + .trainerClass = TRAINER_CLASS_GUITARIST, +#line 16437 + .trainerPic = TRAINER_PIC_GUITARIST, + .encounterMusic_gender = +#line 16439 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 16440 + .doubleBattle = FALSE, +#line 16441 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16443 + .species = SPECIES_ELECTRIKE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16445 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16444 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16447 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16449 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16448 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16451 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16453 + .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), +#line 16452 + .lvl = 37, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16455 + [TRAINER_FERNANDO_4] = + { +#line 16456 + .trainerName = _("FERNANDO"), +#line 16457 + .trainerClass = TRAINER_CLASS_GUITARIST, +#line 16458 + .trainerPic = TRAINER_PIC_GUITARIST, + .encounterMusic_gender = +#line 16460 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 16461 + .doubleBattle = FALSE, +#line 16462 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16464 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16466 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16465 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16468 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16470 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16469 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16472 + .species = SPECIES_LOUDRED, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16474 + .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), +#line 16473 + .lvl = 39, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16476 + [TRAINER_FERNANDO_5] = + { +#line 16477 + .trainerName = _("FERNANDO"), +#line 16478 + .trainerClass = TRAINER_CLASS_GUITARIST, +#line 16479 + .trainerPic = TRAINER_PIC_GUITARIST, + .encounterMusic_gender = +#line 16481 + TRAINER_ENCOUNTER_MUSIC_INTENSE, +#line 16482 + .doubleBattle = FALSE, +#line 16483 + .aiFlags = AI_FLAG_CHECK_BAD_MOVE, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 16485 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16487 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16486 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16489 + .species = SPECIES_MANECTRIC, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16491 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16490 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 16493 + .species = SPECIES_EXPLOUD, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 16495 + .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), +#line 16494 + .lvl = 41, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 16497 [TRAINER_SAWYER_2] = { -#line 16433 +#line 16498 .trainerName = _("SAWYER"), -#line 16434 +#line 16499 .trainerClass = TRAINER_CLASS_HIKER, -#line 16435 +#line 16500 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 16437 +#line 16502 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16438 +#line 16503 .doubleBattle = FALSE, -#line 16439 +#line 16504 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 16441 +#line 16506 .species = SPECIES_GEODUDE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16443 +#line 16508 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16442 +#line 16507 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16445 +#line 16510 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16447 +#line 16512 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16446 +#line 16511 .lvl = 26, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16449 +#line 16514 [TRAINER_SAWYER_3] = { -#line 16450 +#line 16515 .trainerName = _("SAWYER"), -#line 16451 +#line 16516 .trainerClass = TRAINER_CLASS_HIKER, -#line 16452 +#line 16517 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 16454 +#line 16519 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16455 +#line 16520 .doubleBattle = FALSE, -#line 16456 +#line 16521 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16458 +#line 16523 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16460 +#line 16525 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16459 +#line 16524 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16462 +#line 16527 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16464 +#line 16529 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16463 +#line 16528 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16466 +#line 16531 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16468 +#line 16533 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16467 +#line 16532 .lvl = 28, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16470 +#line 16535 [TRAINER_SAWYER_4] = { -#line 16471 +#line 16536 .trainerName = _("SAWYER"), -#line 16472 +#line 16537 .trainerClass = TRAINER_CLASS_HIKER, -#line 16473 +#line 16538 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 16475 +#line 16540 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16476 +#line 16541 .doubleBattle = FALSE, -#line 16477 +#line 16542 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16479 +#line 16544 .species = SPECIES_MACHOP, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16481 +#line 16546 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16480 +#line 16545 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16483 +#line 16548 .species = SPECIES_NUMEL, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16485 +#line 16550 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16484 +#line 16549 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16487 +#line 16552 .species = SPECIES_GRAVELER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16489 +#line 16554 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16488 +#line 16553 .lvl = 30, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16491 +#line 16556 [TRAINER_SAWYER_5] = { -#line 16492 +#line 16557 .trainerName = _("SAWYER"), -#line 16493 +#line 16558 .trainerClass = TRAINER_CLASS_HIKER, -#line 16494 +#line 16559 .trainerPic = TRAINER_PIC_HIKER, .encounterMusic_gender = -#line 16496 +#line 16561 TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16497 +#line 16562 .doubleBattle = FALSE, -#line 16498 +#line 16563 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16500 +#line 16565 .species = SPECIES_MACHOKE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16502 +#line 16567 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16501 +#line 16566 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16504 +#line 16569 .species = SPECIES_CAMERUPT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16506 +#line 16571 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16505 +#line 16570 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16508 +#line 16573 .species = SPECIES_GOLEM, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16510 +#line 16575 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16509 +#line 16574 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16512 +#line 16577 [TRAINER_GABRIELLE_2] = { -#line 16513 +#line 16578 .trainerName = _("GABRIELLE"), -#line 16514 +#line 16579 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16515 +#line 16580 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 16516 +#line 16581 F_TRAINER_FEMALE | -#line 16517 +#line 16582 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16518 +#line 16583 .doubleBattle = FALSE, -#line 16519 +#line 16584 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 16521 +#line 16586 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16523 +#line 16588 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16522 +#line 16587 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16525 +#line 16590 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16527 +#line 16592 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16526 +#line 16591 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16529 +#line 16594 .species = SPECIES_ZIGZAGOON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16531 +#line 16596 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16530 +#line 16595 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16533 +#line 16598 .species = SPECIES_LOTAD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16535 +#line 16600 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16534 +#line 16599 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16537 +#line 16602 .species = SPECIES_SEEDOT, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16539 +#line 16604 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16538 +#line 16603 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16541 +#line 16606 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16543 +#line 16608 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16542 +#line 16607 .lvl = 31, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16545 +#line 16610 [TRAINER_GABRIELLE_3] = { -#line 16546 +#line 16611 .trainerName = _("GABRIELLE"), -#line 16547 +#line 16612 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16548 +#line 16613 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 16549 +#line 16614 F_TRAINER_FEMALE | -#line 16550 +#line 16615 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16551 +#line 16616 .doubleBattle = FALSE, -#line 16552 +#line 16617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 16554 +#line 16619 .species = SPECIES_SKITTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16556 +#line 16621 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16555 +#line 16620 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16558 +#line 16623 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16560 +#line 16625 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16559 +#line 16624 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16562 +#line 16627 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16564 +#line 16629 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16563 +#line 16628 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16566 +#line 16631 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16568 +#line 16633 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16567 +#line 16632 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16570 +#line 16635 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16572 +#line 16637 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16571 +#line 16636 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16574 +#line 16639 .species = SPECIES_TAILLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16576 +#line 16641 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16575 +#line 16640 .lvl = 33, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16578 +#line 16643 [TRAINER_GABRIELLE_4] = { -#line 16579 +#line 16644 .trainerName = _("GABRIELLE"), -#line 16580 +#line 16645 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16581 +#line 16646 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 16582 +#line 16647 F_TRAINER_FEMALE | -#line 16583 +#line 16648 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16584 +#line 16649 .doubleBattle = FALSE, -#line 16585 +#line 16650 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 16587 +#line 16652 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16589 +#line 16654 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16588 +#line 16653 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16591 +#line 16656 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16593 +#line 16658 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16592 +#line 16657 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16595 +#line 16660 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16597 +#line 16662 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16596 +#line 16661 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16599 +#line 16664 .species = SPECIES_LOMBRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16601 +#line 16666 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16600 +#line 16665 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16603 +#line 16668 .species = SPECIES_NUZLEAF, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16605 +#line 16670 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16604 +#line 16669 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16607 +#line 16672 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16609 +#line 16674 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16608 +#line 16673 .lvl = 35, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16611 +#line 16676 [TRAINER_GABRIELLE_5] = { -#line 16612 +#line 16677 .trainerName = _("GABRIELLE"), -#line 16613 +#line 16678 .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16614 +#line 16679 .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, .encounterMusic_gender = -#line 16615 +#line 16680 F_TRAINER_FEMALE | -#line 16616 +#line 16681 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16617 +#line 16682 .doubleBattle = FALSE, -#line 16618 +#line 16683 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, .party = (const struct TrainerMon[]) { { -#line 16620 +#line 16685 .species = SPECIES_DELCATTY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16622 +#line 16687 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16621 +#line 16686 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16624 +#line 16689 .species = SPECIES_MIGHTYENA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16626 +#line 16691 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16625 +#line 16690 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16628 +#line 16693 .species = SPECIES_LINOONE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16630 +#line 16695 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16629 +#line 16694 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16632 +#line 16697 .species = SPECIES_LUDICOLO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16634 +#line 16699 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16633 +#line 16698 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16636 +#line 16701 .species = SPECIES_SHIFTRY, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16638 +#line 16703 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16637 +#line 16702 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16640 +#line 16705 .species = SPECIES_SWELLOW, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16642 +#line 16707 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16641 +#line 16706 .lvl = 37, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16644 +#line 16709 [TRAINER_THALIA_2] = { -#line 16645 +#line 16710 .trainerName = _("THALIA"), -#line 16646 +#line 16711 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16647 +#line 16712 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 16648 +#line 16713 F_TRAINER_FEMALE | -#line 16649 +#line 16714 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16650 +#line 16715 .doubleBattle = FALSE, -#line 16651 +#line 16716 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 16653 +#line 16718 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16655 +#line 16720 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16654 +#line 16719 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16657 +#line 16722 .species = SPECIES_HORSEA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16659 +#line 16724 .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16658 +#line 16723 .lvl = 34, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16661 +#line 16726 [TRAINER_THALIA_3] = { -#line 16662 +#line 16727 .trainerName = _("THALIA"), -#line 16663 +#line 16728 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16664 +#line 16729 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 16665 +#line 16730 F_TRAINER_FEMALE | -#line 16666 +#line 16731 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16667 +#line 16732 .doubleBattle = FALSE, -#line 16668 +#line 16733 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16670 +#line 16735 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16672 +#line 16737 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16671 +#line 16736 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16674 +#line 16739 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16676 +#line 16741 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16675 +#line 16740 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16678 +#line 16743 .species = SPECIES_SEADRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16680 +#line 16745 .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16679 +#line 16744 .lvl = 36, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16682 +#line 16747 [TRAINER_THALIA_4] = { -#line 16683 +#line 16748 .trainerName = _("THALIA"), -#line 16684 +#line 16749 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16685 +#line 16750 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 16686 +#line 16751 F_TRAINER_FEMALE | -#line 16687 +#line 16752 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16688 +#line 16753 .doubleBattle = FALSE, -#line 16689 +#line 16754 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16691 +#line 16756 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16693 +#line 16758 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16692 +#line 16757 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16695 +#line 16760 .species = SPECIES_WAILMER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16697 +#line 16762 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16696 +#line 16761 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16699 +#line 16764 .species = SPECIES_SEADRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16701 +#line 16766 .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16700 +#line 16765 .lvl = 38, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16703 +#line 16768 [TRAINER_THALIA_5] = { -#line 16704 +#line 16769 .trainerName = _("THALIA"), -#line 16705 +#line 16770 .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16706 +#line 16771 .trainerPic = TRAINER_PIC_BEAUTY, .encounterMusic_gender = -#line 16707 +#line 16772 F_TRAINER_FEMALE | -#line 16708 +#line 16773 TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16709 +#line 16774 .doubleBattle = FALSE, -#line 16710 +#line 16775 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, .party = (const struct TrainerMon[]) { { -#line 16712 +#line 16777 .species = SPECIES_LUVDISC, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16714 +#line 16779 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16713 +#line 16778 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16716 +#line 16781 .species = SPECIES_WAILORD, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16718 +#line 16783 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16717 +#line 16782 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16720 +#line 16785 .species = SPECIES_KINGDRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16722 +#line 16787 .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16721 +#line 16786 .lvl = 40, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16724 +#line 16789 [TRAINER_MARIELA] = { -#line 16725 +#line 16790 .trainerName = _("MARIELA"), -#line 16726 +#line 16791 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16727 +#line 16792 .trainerPic = TRAINER_PIC_PSYCHIC_F, .encounterMusic_gender = -#line 16728 +#line 16793 F_TRAINER_FEMALE | -#line 16729 +#line 16794 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16730 +#line 16795 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16732 +#line 16797 .species = SPECIES_CHIMECHO, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16734 +#line 16799 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16733 +#line 16798 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16736 +#line 16801 [TRAINER_ALVARO] = { -#line 16737 +#line 16802 .trainerName = _("ALVARO"), -#line 16738 +#line 16803 .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16739 +#line 16804 .trainerPic = TRAINER_PIC_PSYCHIC_M, .encounterMusic_gender = -#line 16741 +#line 16806 TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16742 +#line 16807 .doubleBattle = FALSE, .partySize = 2, .party = (const struct TrainerMon[]) { { -#line 16744 +#line 16809 .species = SPECIES_BANETTE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16746 +#line 16811 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16745 +#line 16810 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, { -#line 16748 +#line 16813 .species = SPECIES_KADABRA, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16750 +#line 16815 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16749 +#line 16814 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16752 +#line 16817 [TRAINER_EVERETT] = { -#line 16753 +#line 16818 .trainerName = _("EVERETT"), -#line 16754 +#line 16819 .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 16755 +#line 16820 .trainerPic = TRAINER_PIC_GENTLEMAN, .encounterMusic_gender = -#line 16757 +#line 16822 TRAINER_ENCOUNTER_MUSIC_RICH, -#line 16758 +#line 16823 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16760 +#line 16825 .species = SPECIES_WOBBUFFET, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16762 +#line 16827 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16761 +#line 16826 .lvl = 41, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16764 +#line 16829 [TRAINER_RED] = { -#line 16765 +#line 16830 .trainerName = _("RED"), -#line 16766 +#line 16831 .trainerClass = TRAINER_CLASS_RIVAL, -#line 16767 +#line 16832 .trainerPic = TRAINER_PIC_RED, .encounterMusic_gender = -#line 16769 +#line 16834 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16770 +#line 16835 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16772 +#line 16837 .species = SPECIES_CHARMANDER, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16774 +#line 16839 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16773 +#line 16838 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16776 +#line 16841 [TRAINER_LEAF] = { -#line 16777 +#line 16842 .trainerName = _("LEAF"), -#line 16778 +#line 16843 .trainerClass = TRAINER_CLASS_RIVAL, -#line 16779 +#line 16844 .trainerPic = TRAINER_PIC_LEAF, .encounterMusic_gender = -#line 16780 +#line 16845 F_TRAINER_FEMALE | -#line 16781 +#line 16846 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16782 +#line 16847 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16784 +#line 16849 .species = SPECIES_BULBASAUR, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16786 +#line 16851 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16785 +#line 16850 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16788 +#line 16853 [TRAINER_BRENDAN_PLACEHOLDER] = { -#line 16789 +#line 16854 .trainerName = _("BRENDAN"), -#line 16790 +#line 16855 .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16791 +#line 16856 .trainerPic = TRAINER_PIC_RS_BRENDAN, .encounterMusic_gender = -#line 16793 +#line 16858 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16794 +#line 16859 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16796 +#line 16861 .species = SPECIES_GROUDON, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16798 +#line 16863 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16797 +#line 16862 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, }, }, }, -#line 16800 +#line 16865 [TRAINER_MAY_PLACEHOLDER] = { -#line 16801 +#line 16866 .trainerName = _("MAY"), -#line 16802 +#line 16867 .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16803 +#line 16868 .trainerPic = TRAINER_PIC_RS_MAY, .encounterMusic_gender = -#line 16804 +#line 16869 F_TRAINER_FEMALE | -#line 16805 +#line 16870 TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16806 +#line 16871 .doubleBattle = FALSE, .partySize = 1, .party = (const struct TrainerMon[]) { { -#line 16808 +#line 16873 .species = SPECIES_KYOGRE, .gender = TRAINER_MON_RANDOM_GENDER, -#line 16810 +#line 16875 .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16809 +#line 16874 .lvl = 5, .nature = NATURE_HARDY, .dynamaxLevel = MAX_DYNAMAX_LEVEL, diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index bd18995a2e..b410e810b0 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -425,12 +425,6 @@ static bool match_eol(struct Parser *p) return true; } -__attribute__((warn_unused_result)) -static bool match_empty_line(struct Parser *p) -{ - return match_eol(p); -} - __attribute__((warn_unused_result)) static bool match_int(struct Parser *p, int *i) { @@ -457,6 +451,23 @@ static bool match_int(struct Parser *p, int *i) return true; } +__attribute__((warn_unused_result)) +static bool match_empty_line(struct Parser *p) +{ + struct Parser p_ = *p; + if (match_exact(&p_, "# ")) { + int line; + if (match_int(&p_, &line)) { + struct Token t; + match_until_eol(&p_, &t); + p_.location.line = line - 1; + *p = p_; + } + } + + return match_eol(p); +} + __attribute__((warn_unused_result)) static bool match_identifier(struct Parser *p, struct Token *t) { From aeb9da337e506cae3548b23b507ddb89c5975014 Mon Sep 17 00:00:00 2001 From: tertu Date: Sat, 10 Aug 2024 06:33:05 -0500 Subject: [PATCH 063/225] Add some null pointer checks (#5130) * Fix some null pointer uses * fix bad merge --- src/pokemon_storage_system.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index fe65df0114..6c9c53fd7f 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -1998,7 +1998,10 @@ static void VBlankCB_PokeStorage(void) ProcessSpriteCopyRequests(); UnkUtil_Run(); TransferPlttBuffer(); - SetGpuReg(REG_OFFSET_BG2HOFS, sStorage->bg2_X); + if (sStorage != NULL) + { + SetGpuReg(REG_OFFSET_BG2HOFS, sStorage->bg2_X); + } } static void CB2_PokeStorage(void) @@ -4206,11 +4209,14 @@ static void StopFlashingCloseBoxButton(void) static void UpdateCloseBoxButtonFlash(void) { - if (sStorage->closeBoxFlashing && ++sStorage->closeBoxFlashTimer > 30) + if (sStorage != NULL) { - sStorage->closeBoxFlashTimer = 0; - sStorage->closeBoxFlashState = (sStorage->closeBoxFlashState == FALSE); - UpdateCloseBoxButtonTilemap(sStorage->closeBoxFlashState); + if (sStorage->closeBoxFlashing && ++sStorage->closeBoxFlashTimer > 30) + { + sStorage->closeBoxFlashTimer = 0; + sStorage->closeBoxFlashState = (sStorage->closeBoxFlashState == FALSE); + UpdateCloseBoxButtonTilemap(sStorage->closeBoxFlashState); + } } } From 2237e33ab2feb989888b23beac77261e1a6381b5 Mon Sep 17 00:00:00 2001 From: Cafei <46283144+cafei-uh@users.noreply.github.com> Date: Sat, 10 Aug 2024 21:43:19 +0400 Subject: [PATCH 064/225] Pokemon spite fixes (#5126) Various Gen 8 (+Sawsbuck Summer) sprite fixes for overworld and battle sprites. --- .../pokemon/articuno/galarian/overworld.png | Bin 1354 -> 1352 bytes .../articuno/galarian/overworld_normal.pal | 12 ++++---- .../articuno/galarian/overworld_shiny.pal | 26 +++++++++--------- graphics/pokemon/bounsweet/back.png | Bin 467 -> 424 bytes graphics/pokemon/bounsweet/overworld.png | Bin 1247 -> 524 bytes .../pokemon/bounsweet/overworld_shiny.pal | 4 +-- graphics/pokemon/bruxish/overworld.png | Bin 1559 -> 838 bytes graphics/pokemon/bruxish/overworld_shiny.pal | 4 +-- graphics/pokemon/cursola/front.png | Bin 895 -> 863 bytes graphics/pokemon/cursola/shiny.pal | 8 +++--- .../pokemon/darmanitan/galarian/overworld.png | Bin 747 -> 747 bytes .../darmanitan/galarian/overworld_normal.pal | 14 +++++----- .../darmanitan/galarian/overworld_shiny.pal | 18 ++++++------ graphics/pokemon/darumaka/galarian/back.png | Bin 558 -> 496 bytes .../darumaka/galarian/overworld_shiny.pal | 16 +++++------ graphics/pokemon/darumaka/galarian/shiny.pal | 8 +++--- .../pokemon/farfetchd/galarian/overworld.png | Bin 745 -> 745 bytes .../farfetchd/galarian/overworld_normal.pal | 2 +- .../farfetchd/galarian/overworld_shiny.pal | 12 ++++---- graphics/pokemon/guzzlord/overworld.png | Bin 1871 -> 1882 bytes graphics/pokemon/guzzlord/overworld_shiny.pal | 4 +-- .../pokemon/moltres/galarian/overworld.png | Bin 1172 -> 1192 bytes .../moltres/galarian/overworld_normal.pal | 10 +++---- .../moltres/galarian/overworld_shiny.pal | 20 +++++++------- graphics/pokemon/morelull/overworld.png | Bin 1163 -> 441 bytes .../pokemon/morelull/overworld_normal.pal | 4 +-- graphics/pokemon/morelull/overworld_shiny.pal | 8 +++--- .../pokemon/mr_mime/galarian/overworld.png | Bin 670 -> 670 bytes .../mr_mime/galarian/overworld_normal.pal | 4 +-- .../mr_mime/galarian/overworld_shiny.pal | 14 +++++----- graphics/pokemon/pincurchin/shiny.pal | 4 +-- .../pokemon/ponyta/galarian/overworld.png | Bin 723 -> 738 bytes .../ponyta/galarian/overworld_normal.pal | 2 +- .../ponyta/galarian/overworld_shiny.pal | 22 +++++++-------- .../qwilfish/hisuian/overworld_shiny.pal | 4 +-- .../pokemon/rapidash/galarian/overworld.png | Bin 964 -> 965 bytes .../rapidash/galarian/overworld_shiny.pal | 12 ++++---- graphics/pokemon/regieleki/overworld.png | Bin 963 -> 817 bytes .../pokemon/regieleki/overworld_normal.pal | 2 +- .../pokemon/regieleki/overworld_shiny.pal | 4 +-- graphics/pokemon/runerigus/shiny.pal | 2 +- .../pokemon/samurott/hisuian/overworld.png | Bin 1300 -> 1100 bytes .../samurott/hisuian/overworld_normal.pal | 2 +- .../samurott/hisuian/overworld_shiny.pal | 2 +- .../sawsbuck/summer/overworld_shiny.pal | 12 ++++---- .../pokemon/slowking/galarian/overworld.png | Bin 744 -> 741 bytes .../slowking/galarian/overworld_normal.pal | 6 ++-- .../slowking/galarian/overworld_shiny.pal | 18 ++++++------ .../pokemon/slowpoke/galarian/overworld.png | Bin 642 -> 638 bytes .../slowpoke/galarian/overworld_shiny.pal | 18 ++++++------ .../pokemon/sneasel/hisuian/overworld.png | Bin 683 -> 629 bytes .../sneasel/hisuian/overworld_normal.pal | 8 +++--- .../sneasel/hisuian/overworld_shiny.pal | 18 ++++++------ graphics/pokemon/sneasler/overworld.png | Bin 1061 -> 935 bytes graphics/pokemon/sneasler/overworld_shiny.pal | 12 ++++---- graphics/pokemon/sneasler/shiny.pal | 2 +- .../pokemon/stunfisk/galarian/overworld.png | Bin 519 -> 519 bytes .../stunfisk/galarian/overworld_normal.pal | 10 +++---- .../stunfisk/galarian/overworld_shiny.pal | 8 +++--- .../pokemon/weezing/galarian/overworld.png | Bin 1300 -> 1302 bytes .../weezing/galarian/overworld_normal.pal | 4 +-- .../weezing/galarian/overworld_shiny.pal | 10 +++---- graphics/pokemon/yamask/galarian/back.png | Bin 388 -> 350 bytes .../pokemon/yamask/galarian/overworld.png | Bin 577 -> 577 bytes .../yamask/galarian/overworld_normal.pal | 10 +++---- .../yamask/galarian/overworld_shiny.pal | 20 +++++++------- graphics/pokemon/yamask/galarian/shiny.pal | 4 +-- .../zacian/crowned_sword/overworld.png | Bin 1224 -> 1222 bytes .../zacian/crowned_sword/overworld_shiny.pal | 20 +++++++------- .../zamazenta/crowned_shield/overworld.png | Bin 1166 -> 1166 bytes .../crowned_shield/overworld_normal.pal | 2 +- .../crowned_shield/overworld_shiny.pal | 18 ++++++------ .../pokemon/zapdos/galarian/overworld.png | Bin 1034 -> 915 bytes .../zapdos/galarian/overworld_shiny.pal | 6 ++-- .../pokemon/zigzagoon/galarian/overworld.png | Bin 830 -> 862 bytes .../zigzagoon/galarian/overworld_shiny.pal | 14 +++++----- graphics/pokemon/zorua/hisuian/overworld.png | Bin 845 -> 721 bytes 77 files changed, 232 insertions(+), 232 deletions(-) diff --git a/graphics/pokemon/articuno/galarian/overworld.png b/graphics/pokemon/articuno/galarian/overworld.png index 734f4802d9ac181e17817ad8d8a395d09aa2a3ab..51e46babdbde6230a5451f4b2d8b7c8650b2d90e 100644 GIT binary patch delta 1320 zcmV+@1=sq@3djnOF@G>nOjJcYxR(F`0C>pwpy2psMT*qE>6LH3DI6^5%;>(O#-e_# z%eB$}|Nl5RI2afh0001yIs$C~000nlQchC<|NsC0|NsC0|NsC0|NsBMP>VwV00gQ@ zL_t(oh2>a*a^ortj9OwDZ1ex0`&JTQ4C2yvb2Im5o;yw2V1J|C)k;8Kum9`C{I?PO z#>E|K3V)RW^S@V+`MquTV-%>(wT|*z=sqLi4HtdB@A2Pz3nAPTxK2R(-e;zJeBb97 zAESP}RLDRy&om0gp}U6^|4o5IBM>7f)Z3aafFI)&gg)!`3BLew(2ovzbsAe_1rP2@ zfklKe(lH= zk?!$N=x2{tVKyKC=nzcuypa^YPNesBLejY#0Zbwc1tAC=`;5Ph{}R6E@sc{4@msD& zhd=^)W|2UE*(f|`uPFdFihIN>xe4gTe}&)mc+H$cz<-*EIz)II1%*E}5pj=OgT&_! z3QQO9!TNaTC<)+!z&-9vQk$~xaRde=BQO*Pr6eU-EJD>GfS=OHRcmlAE~G$mz`!j4 zx3xP)$1c807!R@^*YLHHYzZ->F{)*pYP#wZaGe6ZoKz)DZk~^y1 z@(zvI31hdyjQ``50Mw>XcWY1=WKIe&v9kmh1Ai5MV;vTU$dibi(lKfma@Nc$1MM_j zG1GyhMeY=4N#ikAz$FYAx%9graVi!`UYYX4Vq+Z^hlp|#danOVo=WAxvYfV?U|K{m4Ns3IqQ!n}8)S zv=SIg25=F6R|#n2V+yK6Smi${4BJZ0Ku&w}5I-#>H=L-Ts&HaQf3&J}T|tF7d75 zW!zfsgMd0jud?HrcMMqx0HyBbLzvbhY6^R2ol_hj46-=jT-1Sx=M1sbCvzLu6!e`) z9C9`Mv&E|j7?*9bWXM@ho5C{yS*>>@DQDoPT~_GPIY#-;5Yaeweo z*3|noS_#BcH#*zqo{O5oGyYxhi$mn+MY`GV;&%Y8zQ(iZW;^x3HVy`Krh$Q004JMc zMZh|&cOWhdvV*@YQL@bw{7Rr-thfQ(sy`pWWmsj?=3>}T2lQOcqzI9M#4C@NM&KfE zDwx9K$7Z0{P2EgXckqU<9VJGC%74+$WV^@7wvMBI;vwmwuEz=cGiQl=ieL&)pQrdd z+>q=UZ~WzvvPTKqGx+`80M%pb;!sI}^hgq1k0WD;)89u5UTwtb`vs!5Vd%fR5DHW9 z?uL@2<)OGHcmadQGv3cGa=soh3N#X!&&&2%_vfO4{0Ikq(tq*bs^pt<{vpI{KY8*G ee69E2yZ!+({We$q8QPHm00006LH3DI6^6=;^+r#-e_# zc*yvm;P^N=I2afhYnlrp0000FbW%=J0RR90|NsC0|NsC0|NsBxjh?0e00gi}L_t(o zh2>a*j_f83Tq8CFlI8zDw__U!!Orb#`=nQ?oNo6nBrr1`8-K{_^?z+4{AmRLpoIxF z#Xrg*guky~2=8sX9-~P5M@s48iRYew*8qM)qwn|K{(EmR#*0Ge1JJ%tK(A3#+IKt0 z*IB($F)+H znXdkC=&i>a@v!;$SBGGb`;8>{Wgxk45|WNx31ARr$OxIhei;0t|3~%X@psK{^%wt`w~N9lyt*J0ul}JRZLnFn~Ib+G0n& zT3%B_yn?<<;e`KBV`~VAp2!|M_~_5QdH6?mYp&mxnBfpn&T5BS>PPT*=2G^jwe&;?>QK1aAToqh zDSy5r)u&A|6`2B`PX3DZ#owi*dHeU89HRIkk=Y1wh)TI)7w!ZQe#D?Qg@OODCP+Ln zv|<>K4B#UCJ_TU(uOa9TNh1G2aoJW%1Zvrbhr-=Le8Y(h>I#?S=zl<+&nJoyhtGg2 zv<&$4@t>prG$vw)WW}#*=@tzG3<3>Vy??N6X1zuwzZABG68JO5;8r2vGlLi${6c`C zX+Ir?fH*{2+ws^PLlpu*DSP=C&3Z&bVMoDqvICewWe1!OdBEa18+n*sH~6hzLNHe% zcF1Sow-z5F6ztKW_{UjKhr$-X0nK&N4 z0|~vKqn!Y3$Zgx)bJ0-P;y)QbJA{8;%;20EOaL{%*0brRJ9WMulmTy_?hGUYk`xHf zTKlTvUP}k#x{h6~o-9=D^&GnM+ zha2KOR#7#0Wv0001;w}I>c0004VQb$4nuFf3kkv=bf$iRU2@VEc~0B^!5 zfB*miCP_p=R9J=Wl|hz-APfZ!#AN0DuRA0VTI@C;{oc$h_#53+kp#qTTUlB8wLr>O zc#Hw?8$2aU3JN|gD0m2yE#M2ED*zQw^yC0A#0ayCXF=^9ERO}4@o0JED1sAS9M1$7 zTooPAdQ}00@FwtoPgSlM%HU8e7ln<+!L?IcO%-|?G~k}g+Ay5fLn#DpBh~VN7Xcy> z^UH8sKN^Iw5s-!%-PN0K_XAI~^F5mj2!=ERrz+T~Cn%{VnKzvTz5&4aY61kJVFOk^ zzov0F_@F>`iAhfkU9w0000007DOfr2qf`32;bRa{vGi!vFvd!vV){sAK>D0W3*GK~zY`?US)? zgD?<=jfBJsDe8{P3&ef_peH(IBwaf+$C^r2^P*jOm)_Y$#da`Lhe-L?@8iz*ONe`J zIZ2Vn`GYFsTiml@e>YQ?aJ4CwJmcf-d=)tk#4%40_ynE5x8Z5ULxq-Yn;asKUGuAaip>U&Q3sIDTzg^~W@zaEf>pX!}!ndOVfJ zIL4^>lQ|Vw9t(YV12Q)WV@QY`Hkr}<*`F^ZKfeG9R|}{H^S?bQp6L-OS4Tb~rQ%Pn gA!FU(JzZabZ%nKrfeE~7ssI2007*qoM6N<$f}ZNc*#H0l literal 1247 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_CgBeH`yR~lzQjEnx?oJHr&dI!FU|?nl@CkAK z|NsBP7cUMxD0p##p<;(e$IPh@G8!HvOgJ3aI@2v@g+oNMY)r6}o~^s9f`bCkgi$aW z0>dc;u219K56l<6o-U3d5v^~hJ zbK9O>Ir{O=)!CY3Qkwsv?%s5{o7W(|GrJS!?WY74}N12 z_4^*ZjbkfsmJI8G@3!oQY$>gTe~DWM4fbzSpw diff --git a/graphics/pokemon/bounsweet/overworld_shiny.pal b/graphics/pokemon/bounsweet/overworld_shiny.pal index c97f75961d..769d9abd9e 100644 --- a/graphics/pokemon/bounsweet/overworld_shiny.pal +++ b/graphics/pokemon/bounsweet/overworld_shiny.pal @@ -2,11 +2,11 @@ JASC-PAL 0100 16 255 255 255 -225 232 232 +247 240 184 216 192 248 232 200 0 160 128 240 -136 153 149 +200 192 128 224 104 128 200 112 152 176 64 104 diff --git a/graphics/pokemon/bruxish/overworld.png b/graphics/pokemon/bruxish/overworld.png index 18b2325a80c8bcff63230dad180aa5a88c541990..04757426e6ccfe11dbca043c33b9b45f78f60077 100644 GIT binary patch delta 385 zcmV-{0e=3M48{hKFaiKDkuo$0oANmY0008SlRg6>3f7&;%fa?85<*#%X#;=(+mq@8 zx_|1vAx-!O1m??)f8{rW=yJ^;^^VDyYhn480xw1psz3290pNy1q=zm{#N{v=7`V20s}*K3{m<)q7ohihn~$ f?Vh2j`!B?A9=I&8XZhQq00000NkvXXu0mjfzq`B$ literal 1559 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_CgBeH`yR~lzQjEnx?oJHr&dI!FU|?nl@CkAK z|NsAwFJHcXbbolqVac@@M@}EwyUY1S#g+}JN3AncdxGY9dr5^GRAlP-sEKO>O&A5E zAuyamK=9zZM+^*1M?GB}Ln2z=PQO@mSAoYRms@#3!@vLeyOmZR-^hAriRW_uu(VG_ z8}@d$T!@{fKCj|Yr~15%iJ!~${~T9*Xqsqwf?xY*ln006z72Xwck5p|#Bk`H(>b!@ z^e(odb%&3q|5?w(*HxU%esQPK1$|2%(XbEmPtV(NBsFV6!7HhTeFjAak1rT(G=Fqq zzQyx}%`b|cT`3M&$+=|SA<6mQ+ZCrzvGEUDqk70rwYt~k>5u!>RfiVl=Oi53{9~K5 zPMWpr_vgp#sVVa%Ss> z8t+E&#T-}X|Cq*5a9Ht@b9CH&)&SR~_s%0p@wdjij=wk*#>x3> zOPWLVg|`AzAALx3(H6XC_N-u^zHXgtX3Mob3wI@4wn;VKXTmI#{i5gTtfG(!7hSxy zv!}YRbqm$h`*Zjpd*7*in;3Q`%`H2d_V;#WCLH>2@xt%6)%w}L#P5Ay7Vy+LzO8xE zl4T*h>)waY%Tw+ZP}|y2x$ZXGahbrq6K_4Pyv`$`>vOI2c(wVRk{!tk7pi@F*589-ei4<$t?ig3e!sHN_jQUtq4Az3p7gmAEYSmt|90$|GcB zo(kVnJM?eM+Ru6Ed^)bHzQ5<%yZ*a#UBT4)$H%Sa6#N#d=;fE?`Lcb*)_<#_Zpl^} z|NAyku%^+ReXeQLmdo>#zs8Bre{^3UXm@(XtAE@dr8|UmX5O6t_XjA0db;|#taD0e F0sy1Mk?Q~e diff --git a/graphics/pokemon/bruxish/overworld_shiny.pal b/graphics/pokemon/bruxish/overworld_shiny.pal index 624b47c64a..7de5796528 100644 --- a/graphics/pokemon/bruxish/overworld_shiny.pal +++ b/graphics/pokemon/bruxish/overworld_shiny.pal @@ -5,13 +5,13 @@ JASC-PAL 248 244 244 232 208 136 225 220 64 -224 216 208 +248 248 248 196 203 194 200 160 80 232 56 40 104 208 152 59 105 101 -140 82 158 +56 160 104 75 74 26 56 160 104 105 44 76 diff --git a/graphics/pokemon/cursola/front.png b/graphics/pokemon/cursola/front.png index 2e4036381214f9435653aec22e26c869cfdbff17..5dd4cea7de0a60382d0071ee68d84310448e1fb2 100644 GIT binary patch delta 803 zcmV+;1Kj-o2Hysd7#0Wv0001;w}I>c0004VQb$4nuFf3kks&pI^78VFifhgQ00P}f zL_t(og{78>va28rh8q%?o~zdPf7_cC#jRqQ>5Q%XAKB^ab+Q1?-rQS|68?l$0B#t- zzuq9|DFQ&s4S|2V1JF}sFXp@l+%X^kEPrBv5lHrKBjEb4fz*>oH`l%Lz`ql?g&&KijD<=S)zpgQnFXU8z0jSRHVrd99*xzAt4^~UG zdE4R(!ZwjQ`H}$4a{rAU6DjKERPv{6}Ch> zAX^Gt-vVU%QFv_nq8=DQY{-zC%(r@yyk?Js0CFksS(ZSGgn{xR2?qdH&1dNeK$+iv zqGyVPA~lVF_$T_mx91`>0iar3+hkxi!2BLYro6}EW6Wn-%~#F( z8DN;lfnC@Gylz!~R8v@!z@K^4AeakbfHo#K=f(A)qS7y(I_p4fAzSHsPOO&(M zkm|E(v`(*#554+mgi;;Y^wqh#j(@j7_0-BQW^>bjz*$>K-*XN0nm6Ie@|yTPyhe`07*qoM6N;tV1mtWdJ_Nu delta 835 zcmV-J1HAm-2LA?-7zqRe00013M{MnpE;WDn@c2~zWrP3#010qNS#tmYE+YT{E+YYW zr9XB6000McNliru=LQD?6C9&xg)jgB0^&(TK~zY`g_gZ;+b|S`DR49jn6#Z;*RtTj zEfmojJ4lws4z9%RHV{8Zw*E|ggg!x#)oF*Uae*SumS*YRJVOs9Igw>a;b7S0$9sS7 zJ-j5$SY-&-JuLFNSpaIkPW_{00YD{Qi5>$M^(6&*57?{`(4~ZI0GPBR8tlJA;V4Z> z4)v{mo{e<+)=?Igw4pLC#B3oO(j4vqK@l}%F`tu7Ibajk4+9wO`64QTkYdrVmjEF1 zNje??N#RimnBj>}LvtKMX#&*%MC5-uh57H)m(2GLDf+7{RDZ}O_j8mo4r|tnEjWqLZLB$BP z)?TGmFtuQc+tL;9H_w2m9;6s(pEfHY&el-SP+-sJsg~FjYB>=Ys}r(EsWE@y={!{u z0+=l610ll6XgwKu)wbhtriB3}n{xuPSv$+J2aSscfS?b+oqnY$Z2*U5+gZh-CoFWosh^G zArK%c)}4dKwu;H6I5XW-j_TC_;N;uPm4XA2P_@gY;xOM88*z0Sjr0Dh-f(ql0^|*6 zS{@%t*4`QXwsHB2?0qk{<^b>ups=6kA2laTM@ve)wr7&(K+Qi^(-40&=y++lsUz)r zixFbd3CwYUye@#pN#{D_S@r^;lSTXLt1aGytRu(U**z|G_IBGAfPVf?boOvd_iez# zT^v8atJy^((ECR}@7|f7ncXx4k3_F;AG-m1^Z1u&*9@>9Pr$Ec;3@}xftZ#R1z|}9!pB-%KbpXBXC0(#KuUQW}dvx)_KY*j{{{af1x2>IlIjjHx N002ovPDHLkV1hU@dV&A| diff --git a/graphics/pokemon/cursola/shiny.pal b/graphics/pokemon/cursola/shiny.pal index 552b1077fc..9259843950 100644 --- a/graphics/pokemon/cursola/shiny.pal +++ b/graphics/pokemon/cursola/shiny.pal @@ -2,16 +2,16 @@ JASC-PAL 0100 16 152 208 160 -184 184 184 +145 145 145 248 240 248 120 120 120 224 216 224 208 200 208 -144 136 144 +92 92 92 184 176 184 -224 96 144 +192 96 224 248 248 248 -248 160 192 +221 173 237 16 16 16 72 72 72 56 56 56 diff --git a/graphics/pokemon/darmanitan/galarian/overworld.png b/graphics/pokemon/darmanitan/galarian/overworld.png index dda43e6e075e81e0cda84e932ceb70ff8daf09b9..f6d78555e5bcf46abb9ae1e10b8bd0e2d29dc9a3 100644 GIT binary patch delta 30 ocmV+(0O9}Z1?vTnMH48%r~m)}c$?8rZ=nDG|K`-J_OV!#0@r;Hk^lez delta 30 ocmV+(0O9}Z1?vTnMH5}T(f|Mec$?8rZ=nDG|C2uO8?jiE0@e8rZ2$lO diff --git a/graphics/pokemon/darmanitan/galarian/overworld_normal.pal b/graphics/pokemon/darmanitan/galarian/overworld_normal.pal index f573721897..2036748fc6 100644 --- a/graphics/pokemon/darmanitan/galarian/overworld_normal.pal +++ b/graphics/pokemon/darmanitan/galarian/overworld_normal.pal @@ -6,14 +6,14 @@ JASC-PAL 167 167 167 215 215 215 10 34 40 -93 188 210 +40 192 168 0 0 0 120 155 209 79 111 160 255 255 255 -10 10 10 -11 11 11 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/darmanitan/galarian/overworld_shiny.pal b/graphics/pokemon/darmanitan/galarian/overworld_shiny.pal index f573721897..e61043b14e 100644 --- a/graphics/pokemon/darmanitan/galarian/overworld_shiny.pal +++ b/graphics/pokemon/darmanitan/galarian/overworld_shiny.pal @@ -6,14 +6,14 @@ JASC-PAL 167 167 167 215 215 215 10 34 40 -93 188 210 +72 160 216 0 0 0 -120 155 209 -79 111 160 +190 224 117 +74 105 37 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 255 255 255 -10 10 10 -11 11 11 -12 12 12 -13 13 13 -14 14 14 -15 15 15 diff --git a/graphics/pokemon/darumaka/galarian/back.png b/graphics/pokemon/darumaka/galarian/back.png index 94115f536adc13cf784b4068ddda0a3f869c423b..8aef0d7756517a5132535cb4b277f64f5bccd049 100644 GIT binary patch delta 455 zcmV;&0XY7y1n>ip7%&I}0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!goU1$&x z5Gbm^Xxiu?lAw`TAAhB>4FCWEZb?KzR9J=WmC=%eAPhxIl$5~#|L=06xU3SS`qWwP zbbR6*2oU;uJ$dqf;=Q|v&of=eUB>6hU0#CA^yIz2yaWgOj=-;it2LAbTwcOGK|($i zMpnld@AIMK(0=jNF~&PLO*4`e6}~7&1f;d9WXD5MMt_BXUq^r(`OOd_QM3x8 z4qpruMa~4&Bl6(_ieu&X3R{3HPSr@DIJZAZ9X^K4Cs`3(7}?{z+$Kv918tba zTY`|2YbB}E;(sjz>0V*pGP{ARpmmdj?sYP;S`Z{QnhAZ%hfQw@(2#9GU^?d+4JqMJ zMCOTx1S&bcO4{NyD&S;1YvTejZX_*LHkx=t^=m#!5G3Ors04OHP|Y_LsWbgzNcQZ? xcX1p@Sc@4W`~F5KduJo(c60D96PXi(@X3k(1N002ovPDHLkV1n^J%eMdk delta 517 zcmV+g0{Z>%1Fi&+7(fIA00013M{Ml?0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000mP)t-sn9!goXkZW!5GcT?Xz0)&poo!3AAc312><{932;bRa{vGi!vFvd!vV){ zsAK>D0f$LMK~zY`?UONY!Y~kpQ%gvZSc-QTPILGb<1!Jx7R`}6;rx) zX$>1w@q~~7rTKHULkM=_rc#G?=^On%-#h0n-oO4(?D88w4qE-|c-U+6FXD)eTY+2F z4u5nMFly`aiYWy@2fBIw70_YYKX9J!oK24IBUbpF&vuRiy(o@{tnd}FX#zKlMe!Xk zHPc6_|6~K~R6t3U@K*yfi75Y}@^uNaUetl`3_NZ;Ux<~RG3EwqL10~p9P3Vq-36+n#yfu?r^{Ka`#&jR-i zAQuMkmOul5Y+gkO+5{9*?G&LNbpY^Td@SMuvcQ@JPO3?3sjjI#tb?%&1z?Y>k2==2 zC?K&Hf}nLDFsW};Sng`6ZQ~CPEgzeIc;9;A*8A5l%kw?~d4w8$(!|hQ00000NkvXX Hu0mjfTwc~B diff --git a/graphics/pokemon/darumaka/galarian/overworld_shiny.pal b/graphics/pokemon/darumaka/galarian/overworld_shiny.pal index 44a066b5bc..409dc17fba 100644 --- a/graphics/pokemon/darumaka/galarian/overworld_shiny.pal +++ b/graphics/pokemon/darumaka/galarian/overworld_shiny.pal @@ -5,15 +5,15 @@ JASC-PAL 10 34 40 36 36 36 0 0 0 -93 188 210 +120 203 214 215 215 215 -56 134 152 -29 45 70 +32 146 160 +31 51 8 128 128 128 -120 155 209 -79 111 160 +182 212 119 +120 184 40 167 167 167 -55 72 127 +64 104 16 +255 255 255 +40 93 104 255 255 255 -80 108 152 -15 15 15 diff --git a/graphics/pokemon/darumaka/galarian/shiny.pal b/graphics/pokemon/darumaka/galarian/shiny.pal index 21bd015c8a..f7748fd8d4 100644 --- a/graphics/pokemon/darumaka/galarian/shiny.pal +++ b/graphics/pokemon/darumaka/galarian/shiny.pal @@ -2,11 +2,11 @@ JASC-PAL 0100 16 152 208 160 -40 104 96 +40 93 104 16 16 16 -40 192 168 -104 232 208 -32 160 136 +40 170 192 +104 218 232 +32 146 160 184 184 192 232 232 224 64 104 16 diff --git a/graphics/pokemon/farfetchd/galarian/overworld.png b/graphics/pokemon/farfetchd/galarian/overworld.png index 343ece6bd68120ffe37d440cfdd7d708685e032d..bde1b5b7ecf99b8e08858dd3316c1150247279a6 100644 GIT binary patch delta 639 zcmV-_0)YML1?dHlQ5n_J#X)sBIWRF&L_yWk#TXP2DJ&`Nbp?fyYAAo*ma8xbg^MvY zl}O(IZ4cm2J0qaWUYxlQ*UZhglk82<)yLzmyY9N{uDkB~GetyS@gu?E`tORj&p9~b zOMbNcAl`}aP%&rBaG7V})#C@4EynGM)2{~k3|Dl>C0-OD#A-2UPfS;bxz-@$0Vk>~ z0Dpu+EEc&vK>(k&_Go|dkJz8t;YHx`^@yCAdjhJ8-3~CXneYm2V;kBCVj!CaW`WP& z0Rnz*Ifknp3d0B^Ky8gRt?hfH0`mC}gO0@mEL``$Le*f`foMdwpEMCb_PJ{6V$h!R zH})*5LkGuH48p5Zhaxi!f(G=tI+QnrUy}-*5#a+HCII@yq4j^6is>T3j-K+F#HZOm z4j6GM{>o@k_X1;BH*DmCQcBC7#h5O;BN9~TOAn@oIN-*;YXmjOmt_WsFqFO&gr{=> zA>9(B#QusnGz@CMm3vc6paTN0q3r_@uGq>4Kz)zQ5s2qBroZv5N!%g1D>=nXkV38w zml0{huseh5hRuI`>XH?}o#IY}bTsclZa6`KRLL^P0XJ@bjd>Nj6O+`2(FpK?_xWZ` zN}8~eC7=cJpS_-Hnh_k_)i#d<0utOx6IN;`5a9nDGAm>{J^z z^QnTrBfv(T{RN^&RnZqBGyR7};?K}EzHaa2lj6m}Z+_mMx$9095j`pL`HAhXZ+_Q* Zs(-t;D19o?kp%z%002ovPDHLkV1l&tJ<P%OYAAoplIt)CM1y6; zDkGu)|Jw`rk<1vdD_PuG7}w0^w4`o?U3on2y6djH?z-!)KT|~X6+aW4uK%uh`<#O_ zzT{`iPvTt&4;6F93?K6>yn6fuv&FbQar(_5pW%v5xx|YCgjg*G?TP8;FxMJ{JmEx@ z1>lcRh{YneCkWuv-XDKm{t^2#JG=^9z8#S>b5B53vD*RWH4}b9``o8KgBZxBfkoi+ zSAc+DTaMvshr%?&3{ZP#P4CAZsepX`!=PjF1Pj;wKcQ-H7(g^4J5HJiAp2Z3bv0QH2cLC}CcSBLV3@M}_GFe1ER!vw&%I<$X2Q!!m7IM7o*llV0I z#{nZQ#a|gM8X6eGx?>|Blu~;3EXH)*9g(2ISVk~4!~u8iT_dPLzAQ69grSV3AUvH5 z27=lej~2S8|G(Acb5V zt|QW?>2L1^JE+;D;dsgh-o1Mb}X8uKc4Cnl*+vk~A8AM-7m zlr&)_OF%2+KYKmZ)DW;G+aSES*?`3%KPdhWN9g@1HuI^ZHN7M-TTCnDboLEs16pgz zG5E%9ipvZU!mQ6P4jVS}E&Df}Pj0alAn7Y47hvJ#2)0|8tO2~lmnr2j;r;nJsCI1T zQw4uVfQ>r)3q+5qVk|^v`ZtTjpP|qAw!M>2iWdjJ`FVTht~*sk^rFb;7q488 diff --git a/graphics/pokemon/farfetchd/galarian/overworld_normal.pal b/graphics/pokemon/farfetchd/galarian/overworld_normal.pal index 0a555549b1..3df22685d9 100644 --- a/graphics/pokemon/farfetchd/galarian/overworld_normal.pal +++ b/graphics/pokemon/farfetchd/galarian/overworld_normal.pal @@ -10,7 +10,7 @@ JASC-PAL 238 234 255 49 89 41 255 202 49 -0 0 0 +213 210 197 65 117 57 57 48 49 82 68 65 diff --git a/graphics/pokemon/farfetchd/galarian/overworld_shiny.pal b/graphics/pokemon/farfetchd/galarian/overworld_shiny.pal index 0a555549b1..2d02e605e7 100644 --- a/graphics/pokemon/farfetchd/galarian/overworld_shiny.pal +++ b/graphics/pokemon/farfetchd/galarian/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 57 153 197 0 0 0 156 161 115 -180 174 156 +200 176 112 180 145 41 -115 93 90 +128 96 96 238 234 255 49 89 41 255 202 49 -0 0 0 -65 117 57 -57 48 49 -82 68 65 213 210 197 +65 117 57 +72 56 64 +96 72 80 +240 216 176 24 20 16 41 44 41 diff --git a/graphics/pokemon/guzzlord/overworld.png b/graphics/pokemon/guzzlord/overworld.png index f9e52bd083253e54a274ecf503c5d489cb18da41..f8e2dd5fe50a5ee03991eec027348821b6f79303 100644 GIT binary patch delta 1083 zcmV-B1jPH#4%!ZoP6IPHJ+V>c0)J8XGdlnP1PDn)K~z|U?N`x~q#z8G5hQTr|9|&7 zAt*Yab6d5w_prD+&NMFFNfU5ce%o*RZNKgRY0T~N75L{HJKnGV4*z^h(I@%vF?|7E zo-_2_8RW>Emc;n{0{onz@6I5{h=0yFqfum%EAa%rw5JR`;Y9cR=D0CTF@J3v_-$L# zA((?J%Tip>tY6`#Z*NZ-dcx_!TvJ>bvJhr^tzmsp{Tc$X2w)0f0Gqy!-zh_-aH+7} z-DeO%q&sun;mQyiobwyrTC_KbG|Yad8U zek$M&uM8#1I6V`4p@tIxhJV2*xEa7z-$4-0h%pA7>JbE>4TmRrx!|2Z?V?ecRfl`L zGK4>f;SO>*U-E^Q79o5N;Hs|@lnhCHg`!-NCUDQd1V89#RFZmYX!Iw%l#I|i+Td{q zmv7|oJs%y0@UG91W(W+eB~9S6&w*u#(~*H9QQ=6DN-WEJ6FkuzUw<-OKpv5@<~&^D z@@KHlP#Ha{J)}{*1Zs%ybD+@r(o!N&c@MJSo0wpNV{H+8XV}c^;e3{)wMqW~D?JM@ z8^gC!|Au!GvzMr7u~UXM$l~G3RdE$aLtGcf;I}n{nZw~-UN;~35O51ify~MaBjBjF zxr-C?06&Upu2Ipc6o1txLX0DrYC*2J3LN1&0*Y(_!~D_%4B@)vi0}g(v#aqXJ@nq? z$e-aw!UBV$D%c#ULDm^B{xMtx4)7ME5I}KVU$57S&!THrXR>#=<1ZdFhSB(m!*&4^ zybfQ8@|H6M6vH&gSSO^jzzshHcKFUOppwESdSJqw74QHK+s2>&Zg-9i=37iLRy%f2Oy z6THF_i$oj3g5rkSCIp3}@YVf`c9`OO0&un}gBcTghE?Ag<~{{lLv)e~KP@Fv^A3SS zoXkN%(oY*F`G3D)Xao&s>oCI`f6&3Ur!`S`Fw|Q*!S={*a;^-Mome%A=p-Z4Y*E&q_+69N~zO2rj86Nr!md#mxq<*sUB6<^IuRk9Ous5V`Fzi#1U`LnLr|SSbPdjLr8&PliMvut%q#nN#>;zVPG+fTPzE=(T zDZboxcr0(-D8sZ(o|^TS-|$Kdl{arK595qF`~_ZYS#T+*25bNT002ovPDHLkV1m*L B3;F;6 delta 1072 zcmV-01kd~04$lsdP6InXMzK-l0)ICq@*4mE1N})vK~z|U?N`xq;~)$)F&K$M|NpzU z5@6#P>|AF$y@x`bI9XA4r3I5^`E9@LxBa&Nr-`(eufRXw#L52p@9@tzj-K_+NB#o5 zJXh$uD=1Nf7Z$vK0e-H~cUMqi#6K5Yu~HP$SCR?*)}AW#h|dc9h*yRjd4Jo$Z`;_W z5D6|XOLoDk{th>NdwZ(T6V4Cjn&QS#l(5ii4eN`_#}G(VfKUhnxa#Zpohp>Ge~fpAZe;s&6NVx){Y6wL;nL`ZPhfJ>#9g5(8=M zrvmQq!cen}%L|EDYPbMk8h^}!n*m((9R%Tw7-PU?9zg=ybQmei8{P@D5X;JJceuw3 zL->OP?jVQjr5|Kz8N&MjF8T^Vt&rwdDe4Pb0rv__@Pm$Jh0R+-qd(y}C#2TV29Gvr!_ zl+W<2X+c)7E3`FYNwyWQ{;9YM9N;ZSA%Nn#zFw~t@7bPRoyo3n$6q~G8OF*_9kvUY z;AQ$ul(qztIrHu>#`bN&3OD=^*x@_BfSnXJv5p0ERv-g7NPj0ln#J2PweRE;9M7{% z+m=@EnAKUfT=*pyyUC?6+^>V+F7Sk_H);X& z6hn+%fi=T$7F%n03z*_1!+O5)J_oXnF&)Et3oka<`#PjsB~)2f?&k?iV2>X|kzvaA zcofei=8atonBXM@T~A*)A!t7{JoHsq4`*daFMz0SB7efvpK~5?Ev*rh%-oWD9$5lr zcnLu-r~J}S3=e%3E=x;?ybV~DBv%*KUz2f;(=rU0000cThfNq57`RJ<{DK+&!$ECX?bVHKN-O|oI1~;5 diff --git a/graphics/pokemon/moltres/galarian/overworld_normal.pal b/graphics/pokemon/moltres/galarian/overworld_normal.pal index ef0bee86ea..ca9a549d10 100644 --- a/graphics/pokemon/moltres/galarian/overworld_normal.pal +++ b/graphics/pokemon/moltres/galarian/overworld_normal.pal @@ -12,8 +12,8 @@ JASC-PAL 249 181 225 120 200 248 160 224 248 -11 11 11 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/moltres/galarian/overworld_shiny.pal b/graphics/pokemon/moltres/galarian/overworld_shiny.pal index ef0bee86ea..8330f2687a 100644 --- a/graphics/pokemon/moltres/galarian/overworld_shiny.pal +++ b/graphics/pokemon/moltres/galarian/overworld_shiny.pal @@ -5,15 +5,15 @@ JASC-PAL 0 0 0 0 0 0 61 0 25 -24 24 24 -56 56 56 -173 28 86 -235 88 147 -249 181 225 +229 185 8 +248 208 48 +240 80 32 +240 128 48 +248 232 104 120 200 248 160 224 248 -11 11 11 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/morelull/overworld.png b/graphics/pokemon/morelull/overworld.png index 6d164768a6902a4a5f6556909a928b46e24af0b3..5f85740da2f6f8a4c662c096d45936cfd91e617d 100644 GIT binary patch delta 403 zcmV;E0c`$@3AqE1Fn<6rP)t-s|NsBySw(czAdqARqt$0LZwg*_Z^90003uNkl7`22)G_|8EPnxhb@v z887T)dU*)!nluEL%jI&pTrSr~chX93)%`{iCS1+!0WCK07k@5PT+Ph}FmXY`RooT; z0AR`~aIvApHHh5D45;!*p?1E8$jkCjp z=R9hl@M8vuH!N_<726hLgFG~;@=D!Xj9cT%-+8a$aK^9K7aWnAZ}i}}zsdpMJmM+N zYEb7Fpz|$K!hiHLD^WNed~#glT!F$T@CA=u^LOxa&bM=(Q^6zBBQ((X+5iGRdBNwr zfy%kRfpb8j0h#jz(mLJ)5(Cf-1pb>A@YUQJP{6X6U0Q%}kp>vgcY{&`Eg&i=@`6Q6 x*mj-_N)FY4`U>Z%`FuAh-;fy4di@^I3y6Ul{S~)TFAM+x002ovPDHLkV1hudzdQf{ literal 1163 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_CgBeH`yR~lzQjEnx?oJHr&dI!FU|?nl@CkAK z|NsB9$1lHLx_Rf)i%&<+9XWDj|Bddd}!hQ;K(D60G{ zRVy{!IU))QeqHZ2om~C3YQq%1^5S}j$>Kk_!ez>fzcWoaG9g3kJ8MJ76fdu(U!)^q z*mMpFZ~Q9toyCFS0I$oH)%k@tKRigXJ)e58U2wvoomnnfhvI6xyB|I%3~+dwdmu>Q zs&tsebFWhN6%xti4&BZ@5scro&VAlfsWRu^^RJBRj~?9)D}Qy}-13q<`>rFdTkChv z|0HXXSl6q=w!E3YFM5uw^h)MgGP91|fABUY@3~d_Vg3(`MK=7n!@#sR^}zQX4JViG zYxZ_{#bh;|Z%ySM)+KBSx&lwk*FM<2(|m!$&zbXYG4yP{cA#>f?h4TjOi9ky*w2I= y+V^?Sf^7>W1Ee2XmCn!Ser3Ld%_ROg^DoxrqEeOe(m$qvQiP|gpUXO@geCw3Ajt9n diff --git a/graphics/pokemon/morelull/overworld_normal.pal b/graphics/pokemon/morelull/overworld_normal.pal index 52cbf93f93..6efa8c740b 100644 --- a/graphics/pokemon/morelull/overworld_normal.pal +++ b/graphics/pokemon/morelull/overworld_normal.pal @@ -6,11 +6,11 @@ JASC-PAL 245 210 217 220 210 232 242 196 206 -196 196 196 +184 131 178 191 196 122 158 158 158 171 152 193 -184 131 178 +196 196 255 146 150 89 224 124 140 120 120 120 diff --git a/graphics/pokemon/morelull/overworld_shiny.pal b/graphics/pokemon/morelull/overworld_shiny.pal index 87d1e9509a..7f3068c455 100644 --- a/graphics/pokemon/morelull/overworld_shiny.pal +++ b/graphics/pokemon/morelull/overworld_shiny.pal @@ -2,11 +2,11 @@ JASC-PAL 0100 16 255 255 255 -176 112 64 -240 144 120 +230 227 233 +186 57 24 220 210 232 -208 120 24 -196 196 196 +209 134 54 +240 192 72 191 196 122 158 158 158 112 40 24 diff --git a/graphics/pokemon/mr_mime/galarian/overworld.png b/graphics/pokemon/mr_mime/galarian/overworld.png index 122bda4a1306a594dc5d24e86ba01c9727dcb55e..fd95946076a2b9c7833996e53e5c485dd14ba1b4 100644 GIT binary patch delta 566 zcmV-60?GZJ1)c?vNFRrGb^rhX_Tu6H|Nl8TIi%k5zP`S3s=jDwXi*?IvXN&me?;My z_kY~kK$C1W9M&I`CgrG#I)4W+H>X>cM~@yodi3c3iR=~)vPP+CYof7@QQQ4LID$g$y`VRv_i^yO$He1IXJ>wsynJAGP2 zyZ2&}hsgn!lit$ntPeD_3DR!u4xlP_t0%Si)jEOzYo%GM>=O(Pa>B|A*&8&bA%rr3 zSXg{zfD)U+CqMOrV?#-iWpPS|<^)DGcpm~qmTSh2<%)5npus78<0ZK_e~t|`MaN!t z*Uo=TL-O8J%*R2hmys5$JQd0wUu_*oXr z0j>n?`T?3xbkOq4-6MkeTP`p--+ZnE0w%;C{k^^bAq*lf{RW=>3;+NC07*qoM6N<$ Eg3l!nq5uE@ delta 566 zcmV-60?GZJ1)c?vNFT47nE(I)_Tu6H|Nl8TIi%k5zP`S3s=jDwXbn!6?2%_Lf1q&d z`#s6Z5*bt8_x(pk8d=1U zW5WuWQFhMNA-t;EB*Kdra%^~=s({fRj3{Y$b%;aNx|hFc2}6zzm;B);doZHpNIuR{ zA3(p>&=Q6m8?FS;=~)w)P})d8fBtCl)B=kba%_0baI`yfdOG?DA7IF_p>L19JAkU_ z2tiEpFgd_-(tCP?^?`;?>9BSOP!+p9kXpiS9YKJ#((Fz435EtaVReP<4Vu#!V;w*& zEWSEGjV<9Pf9eOvhMFSF;?xYy3Cw5=Ax26p*Nh#@72`xvgG=~@*W}(fe>Suf9S7N6 zZ{|OzF^3Q+mB)irk4H%)ksOyWXUkG1%Kn&;Mi~_ zNr6+cXE39J^eL-SQqk3V##ZnP4~pM7Hk^tvb17_>sW_#r%s9!=jjPZELyiq1y)1|P z@-S1Z(2uD8Qqmh%>YL7*f503=jtwHYEZL9VQw@%&?(j}cdoVlzLyiqwy)9CsMlV8z zdDwQ7D%TgrI-OVa^8Kng?4Wx>p1_U6_n?`T?3RbkOrF!y|(ETP`rT-h8bC0w%<7{k^^bBjF+&e~UZ=3;+NC07*qoM6N<$ Eg8iWr5C8xG diff --git a/graphics/pokemon/mr_mime/galarian/overworld_normal.pal b/graphics/pokemon/mr_mime/galarian/overworld_normal.pal index 0166ba80d5..9783b2507f 100644 --- a/graphics/pokemon/mr_mime/galarian/overworld_normal.pal +++ b/graphics/pokemon/mr_mime/galarian/overworld_normal.pal @@ -7,7 +7,7 @@ JASC-PAL 89 106 134 59 49 48 53 69 94 -175 154 153 +135 118 118 0 0 0 246 226 225 255 255 255 @@ -16,4 +16,4 @@ JASC-PAL 190 190 190 113 170 190 104 104 104 -15 15 15 +255 255 255 diff --git a/graphics/pokemon/mr_mime/galarian/overworld_shiny.pal b/graphics/pokemon/mr_mime/galarian/overworld_shiny.pal index 0166ba80d5..b2ee5a4fd1 100644 --- a/graphics/pokemon/mr_mime/galarian/overworld_shiny.pal +++ b/graphics/pokemon/mr_mime/galarian/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -197 44 44 +128 63 60 0 0 0 15 20 29 -89 106 134 +112 96 136 59 49 48 -53 69 94 -175 154 153 +96 72 104 +114 93 92 0 0 0 246 226 225 255 255 255 57 57 57 -164 222 242 +144 176 208 190 190 190 -113 170 190 +112 136 184 104 104 104 -15 15 15 +255 255 255 diff --git a/graphics/pokemon/pincurchin/shiny.pal b/graphics/pokemon/pincurchin/shiny.pal index dd03c31a28..a2b0a156a7 100644 --- a/graphics/pokemon/pincurchin/shiny.pal +++ b/graphics/pokemon/pincurchin/shiny.pal @@ -13,7 +13,7 @@ JASC-PAL 248 136 40 248 240 40 192 88 16 -0 0 0 -0 0 0 +173 255 239 +20 255 210 0 0 0 0 0 0 diff --git a/graphics/pokemon/ponyta/galarian/overworld.png b/graphics/pokemon/ponyta/galarian/overworld.png index ac613865766b406f7a743c17bad7381f62e11239..683780312b2bae83528b1b921dae2d0c72fa92f7 100644 GIT binary patch delta 696 zcmV;p0!RJR1>yyeHh-AVpnFJrgLzsYARye+x5aJ6L2+u;nbp0zy&R63?&|*l003&< z-g9w5=DOzg^4^Wcd71zK0$@o*K~z|U?U&uI+#n2uVqB6LKNUtY^`!}4I0P!icEG^4fgeoF4I%fq8VCVA z7*{kEpF@GeoHFt8(F#{E7$ z<9rlp>-uWFT=N%426(xa0gkEXSPG@j-OM7E^P#fG_k`j&d^7-QrUiUX7#t^`bYtxCXM$;<7nyW{ z!$!v1$mM9|gA9~*WN`$>D0s@VZGiE$z|Qz1!8Wkq2BJuz!I*@xe;T?+gADYz#S;jF z3p*dQ+9TN?j|BH05mrzi=0|6*B9m%=n+RO29x;E8=TFA}UR*Qn43nNBZn3{I{>{zA e4!$Ad--%y-L?(TD`=;Lj0000srHR@s5a0i8`(v`FXLbcU+1|7h zX7=hs`BA`ZO1Is1+ikbqcH94AL{w5Km-&Z=oeM%-=85XQOMekp;EaE2*jo0zx(a8U z_F8MH*>jljkBxFQ+g$-uZW4Wc6OId}5*I+oPlY>03L>slshU95OB@$mkziB+Ay2B5 zGsD9ZFykBa<(z4|#&J9}DS(hCZIt=(GgET}%y<#WSwzYu&P-@>&Yr>Qzv6F!Daelhm&VRUHWlO-GJR0+4XTYz#D-`Y} zG7fHJ^464RXb$-wClsTeaYa9t73yUZVFkUaOFV2jK_0&#`$Q{*7b?J zmHCsyW615Ax{s$&``*oMVm%)!e|>k5Aj79X8TZkXI}TQ7tpx&Soc4Y){`%9wPhkBf zaFoE4uYbJ}UNJ5PCE|}sj8SlWPBCqkQ0j*3PVf zz?>CNdG!-u=;L7h;ov8bP=RPtXmB=RoS&JU(ZB;UE=2;7VB+9|)@CHf>){aoBSHkr z!~N*&UF1@mZxeyZoAKv*{$%~{;O6Ojxbzfpi6Z@#^pHSD`Z1H1lbIafMnBi=Z z)SuGvoDIZkAl*3m)JhOvH46bPN>|UofMBxk23_oPR@F*2{_!FXMzjjpo_2He0j~}Z zJb``Erv)8?HywQXca1)wt|#1gYp1-+<-5Qc4#rXD%||-vqr-3bLz9pKF##Ww!U8mZ z-JbJ+yR(vx9EguN3_&AOgzB9L^MwB4`CI~g&)y7}JKydGeEoafn8k`H@x0CsVQfP? zZ^Y9cvhXXsEc^(URyDZVdi%3YEohO(06Q6CBq#}s`x-fl1o5E*i11u8c*VqZcR6aE zBrm`~wHBw-fsV=S@iVVulhBaLk->g@NnL{^B>XvIlrpoe;I!Pj_Wlv;>vKE00000NkvXXu0mjf Djb`~;Ex>6tkZfg?zZ-~*{tb7J zK$#-!^SvzX6R_?dtc!&Yfe0AJ%Xka0NdgCt*mr@zw2fR8w z@C5crpB8io-gNNk-!=M#x}I>~t)22Nmq&p!9E_vPn~!wTM~4siQOBvo{0g&bPY(U;kb=X0aklJg>7u7~9a! z8}YPFL{AaX(&adkDU&dcsoi!;7<#7}M0000J2eAf_7#0Wv0001UMu)cm0004VQb$4nuFf3kks%|0=y$LH0000000000 z000000000000jwHwEzGDuSrBfR9J=WSJ`62APkEk3GM&?@O%K_uyM0>Z((cNA`p_z z)opvqQ=W3Cz#s8{FOC2R>joaaV6 zV#F5@brb)9AG>3JUwr8O9fPhwtPTW68X-=BEO@Z+Pxzx0qrYR&7bsvEL&cFnNNyWM zO)>YSqU&22bOn|M!GIaBO|0&=L26LttNd$&D}lf>Z!`#8KjCr4KQ$P-{+}C!vb;ut zWxZ4O_DSGg^XT9`e`B!QPXq_Z|JoF^4D#~Q1k|O1d*1Cd z9D=z9$=zrG1E>n9Axuf|S4LlgWA)bIL;sAs{Kdd4o~RuS1l0f=1j1p!X#`E+r9bi< z353ue!5F6~3S0crci|WRU|^WZqL8Q1tiKr4Gn6OsD6mWc)F&Z+^BDY20jBB>uiJ2k zxBQ*KQN){nw|R<&Vqj$uOo2sTOeg297W{T{J-B$oKN%bxV09n^QM)W;g9#hV1`_QG zg8-t+!;?N*i5E=kj}?N8d;Fb)Vqn%^3{qYLjQSI&vlT#TPdoy`=Lx(Lvj+M=iq12! zfi>>&H$r%?C54s)=`V&ygo?RjkA9)G7WB+o#aGQ3tA0w>!Q*S}CVq>b z4=G~?iGvi!H3F4?5Wpjh102V(_`#&%_xST^Yw;h`F)VAp-U&JZC_&tM9dCKkb1M<-n>5YgX`2YX_07*qoM6N<$ Ef+}ia^Z)<= delta 922 zcmV;L17-ZN2EzxC7zqRe0002CwraMKE+c;c0000000000000000000000000@G#7* z0009{Nkl!NaG15(pS24YkP@_j2Y510D1A;4>*6aj65xSz(wr!s0qWuL6}G-Ftt-jCLc} zIqw1v8fS%p=dU2!ZS3xW=_0JN8OZbf_Uo@kR|z#*^EEwJ z^ST(A?jP1sxGv(gr$^B-R81F&_Gc-3&?AFSc?tR<(l%CT%Q5VO)p@C`);#Ednm2s| zZ@mRbxzpZ$#DpnPbiXi+7%YD#@QPOZQ-bQR!xv_>62fZ3+klZd%mOk7fskH^@JaD5 zTAg)@6T=O;m0LTWzKdArc9lyps)@xh6ytg!q5(drVs%9B)UM ztV+L)`Vev(ph*p54CuEB7aR0WkV#`Dp(=>?V|tX=L%NG1AS7mg!l*Bm#H4YVNQh1Y zz4f&A?NEVE6GrsC5#E$vZ93LWU@`%F4(87~M*wr*PcOUBWoKummuFr+Y<0ba3SG|E zIJAT}VeSu8Mo-P?3uk|jbqsa)+kx@}6uO-6{^h@p{Dju_t0q9G@|M70Ge9U-i7X2; z>Hp6i=u#dKyq9_YAVJHA`aWM4Xj{X&kfFzWx|9cndvfS2Aj$^2t!FI=R6arbxB!#& w7!R2mY9h)AZ}{0!{?&9XKl+(-J0_2Rae)b&nk+CZ00000Nks-uM6N<$f=6eejsO4v diff --git a/graphics/pokemon/regieleki/overworld_normal.pal b/graphics/pokemon/regieleki/overworld_normal.pal index 1c69e174c2..f6bab934e8 100644 --- a/graphics/pokemon/regieleki/overworld_normal.pal +++ b/graphics/pokemon/regieleki/overworld_normal.pal @@ -10,7 +10,7 @@ JASC-PAL 208 168 8 248 248 192 248 152 192 -0 0 0 +232 119 176 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/regieleki/overworld_shiny.pal b/graphics/pokemon/regieleki/overworld_shiny.pal index 52fc33ef18..ae43ceece9 100644 --- a/graphics/pokemon/regieleki/overworld_shiny.pal +++ b/graphics/pokemon/regieleki/overworld_shiny.pal @@ -9,8 +9,8 @@ JASC-PAL 172 164 205 172 172 106 238 246 172 -230 238 49 -0 0 0 +248 152 192 +232 119 176 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/runerigus/shiny.pal b/graphics/pokemon/runerigus/shiny.pal index 6166d5bfd6..8fd4e72f06 100644 --- a/graphics/pokemon/runerigus/shiny.pal +++ b/graphics/pokemon/runerigus/shiny.pal @@ -10,7 +10,7 @@ JASC-PAL 216 208 208 184 88 208 144 40 168 -168 56 208 +56 208 174 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/samurott/hisuian/overworld.png b/graphics/pokemon/samurott/hisuian/overworld.png index 6dd47d57773cb2526046401c53de0d4d3040207b..7d4db0b87d2c2c0d20004de530cfd9318e49a060 100644 GIT binary patch delta 1045 zcmV+w1nT>g3d{(Q7#0Wv0001UMu)cm0004VQb$4nuFf3kks%iY4i+$xJ05?oxxUK) z00YWNL_t(oh3%N(mf|1`g(Wluu;Tl_?cPwU6qM-BnVtEuoKvmd5Wa*!(bMUF`>4@R z16a)fr2NYxumCCl@(2t-m49^r79jn62^ke)0IL4Y5m<{bdiO8K5@jRnIvK zF4etz8xT9grjtOY7hxKJTXb2V%d;Yx0d6{G2OvmL%o(%P=q4Zr#@;{@kR9OBt9h6K z)^V^zbI^@)+-hckRd-&p+-3-O-Zi=jNJtA*n4v{Leh!Ex5i%Aj4B~$}^UP}x~Ub^@UKq84@>#VO&OJoM9 zOBC^?kdvg0jYcCpF4H-n8c>WoV5Ckq0aFOtQEo%@3AO-H;aK59kg-fM?&LI7`3z7? zY=MDlxG-N`i5Y-eWzK&k=sE@>>d3b2gHncd_$EFZeR`bLz?G+ zL?xbm!sY;jc#n|zJwP2#_Z5Gx^4aU2;~Pc`5FgbeZ{bB&@4iid1xV*oXi4NZJ#HmV zkwxAC)X~TJ(Z&9s;DG@evoU;|>8>fSOOIrRoYc zsha_^z3VJ>fE}=e*pDBjuv;(wvN|p()&95=N&_h4X(p(Itk&1U{loSFc;`C+?tZj$ z$f(s^xIOjZ(RBcf9RZ&7aJH`N6&IYuE&xhObqD0W#wdTGKTJ>+rQVE1b_Z0x8{w04 zGg1)?UosMYI8I^lwSdweCRBHq^>V@GV9*`7YE~OS=`ySd z(DL;e9+3yf(C>gWX86sY^2(R?+x_l^pXvV}U;OvxulpbK_|t!a{gd_wn3Xn~TdaZe P00000NkvXXu0mjfiEZHp delta 1247 zcmV<51R(p&2$Twt7zqRe0002CwraMKE*Aq37%`DZ9)Af0l`sGR1fNMnK~#9!&6a;m z8)X>BpL?&AGJaj@0Ku(XPkzT`U8m?!Mj_eM#TX14jDNUhGei^PrXiVfGv1QIs4iJWA^sXJ!AA_FnU9T&59Bhlk`2Nw}bI)_1 z=icx0+<*JN0RPj0?lq9SSD>J@%ToEZeUnmJb>q-lPgMy-PUjj+euh!n<@CR-fl6~? zIHJ&;Sii{KpG0b@3h7m~EN=OLzP|*8tH-N=C^G9^sd@*J#YpBZMMit~z=}W%6ut(A zS80OQ00LR8LkkGe4ntF* zhA3`WB9R)H#5zfEPJ$*7zy#vUSezuK0R;FXv<0z%GOdXODj+=cRX@PRQ?w=!U?dg5 zNPofYbXEh1N86|!iy7b(36ww!JSTvU7ov4?RaHO`h8!#jti!DZ#8cY$XH*O=iYHJ5 z19aq>>WR^9yMW;}fkvhiJS==+p)`PaypjACMA=QmemTK1Abg$uuB)ug=+XuxbN7L2amjyV&p?Oz6{nGf9Nxu%S$Gx8zR8qORMyAhAR=`2KGZJ zFKqMXg8PBL^iolXuI=Z)A*~QN#iN%W{RN0yXVZeaQf5xK^fY*%AeRA!R0B(`zkd}f z2#pzMc?}?hr#In_$)CI!3`q$Tz#b5U+dOfzdz{=j_Mk0|Tn^;IwyW#vZG#h=uTEmo#^fI>9MAgC>Tnlk*#^){WcP%1P+H>!Zbw!6Z@N0& z&E8nme5JJB0mqBYa+{*M90x#S#D9A-W?#1unE^&P4~@G1(;}c?j5QMr0D60Wg}C8_ z>$g90nX9bc@U6Vm6`1DRo_52`#%nQP{d;%@Td$Ze$h%E>(_Gij73BBvzP0kx8L;30 zvZl4>2=;T+!ThO)>sEMSXGAK!UmrMjR3Dv^rXHTOe{cjGR6cb#cB%olHAJF*+Tnl{nC3$7Q zAPGn$$$pg6@vCR5w{y4bmw+`t0ensl%c_CLJ^onWyQ8t@1!D|27ys5Nfy$sV2Z&l3 z;E;e_S#cnBIm&v-A$=gRz<;ym!hPI^&*EjmI&EH@6`#jNMm39WiV%`OUM)qthyt#x zVo+j?-=@<4c10Jp?rx9Cf>~r7cMy#JipC<&?O~+UQ!T&MO$iP6YRyk zi~H$!+9Pj*$Mqr*8b6HN7pjBdFGu2jX=H~dcjWfnS@KcUnNc`VB}5ysy{N31QP_$7 zhe@JysiM->75vhv;PrOw5Pz1&s18%iT@E0t`5CDJ5DowN_y?ir6SM__iYx#C002ov JPDHLkV1n)APv-yt diff --git a/graphics/pokemon/samurott/hisuian/overworld_normal.pal b/graphics/pokemon/samurott/hisuian/overworld_normal.pal index e6be3b5f56..15854747e9 100644 --- a/graphics/pokemon/samurott/hisuian/overworld_normal.pal +++ b/graphics/pokemon/samurott/hisuian/overworld_normal.pal @@ -6,7 +6,7 @@ JASC-PAL 0 0 0 238 238 255 189 189 197 -16 24 49 +14 22 48 189 49 49 32 24 32 41 49 74 diff --git a/graphics/pokemon/samurott/hisuian/overworld_shiny.pal b/graphics/pokemon/samurott/hisuian/overworld_shiny.pal index 827453552a..494b52f0aa 100644 --- a/graphics/pokemon/samurott/hisuian/overworld_shiny.pal +++ b/graphics/pokemon/samurott/hisuian/overworld_shiny.pal @@ -8,7 +8,7 @@ JASC-PAL 189 189 197 16 24 49 180 164 156 -197 189 197 +84 80 84 222 213 222 139 115 106 238 238 246 diff --git a/graphics/pokemon/sawsbuck/summer/overworld_shiny.pal b/graphics/pokemon/sawsbuck/summer/overworld_shiny.pal index 34f7d0f0b4..4d2a5df53c 100644 --- a/graphics/pokemon/sawsbuck/summer/overworld_shiny.pal +++ b/graphics/pokemon/sawsbuck/summer/overworld_shiny.pal @@ -5,13 +5,13 @@ JASC-PAL 0 0 0 8 136 64 27 81 44 -40 19 12 -199 170 85 -233 219 172 -176 104 32 +238 222 164 +74 16 8 +84 35 16 +178 114 49 128 64 16 -207 124 25 -141 98 51 +183 167 84 +255 255 255 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/slowking/galarian/overworld.png b/graphics/pokemon/slowking/galarian/overworld.png index 5babfe384b6e99ffc44d02d1f10ced3fde735854..4ff3b7f4b70518426ee559b0e61a19810be7adb6 100644 GIT binary patch delta 690 zcmV;j0!{ts1?2^hKYzCCi00<@oSk!8P;t4lBEoCVqmI9xi+T#DIamkVZ$={b%9gE3_*KZiqs{vxuu!(+Uhgp;H{$q0A>Z4F0)93>fw| z5}0$s?Lv>b3V%tKqk%^__c+5*;L8OEV8SSC4~@sAL@1A_> z-w|?nza*%Pyfh_i33yx%5J8qg8wO^)tt*K|u}ACLo`2-ymH<)F3+(ZJ05b&gX&9LC zbrpvr`tQ$ikzjXj@_FpP&u<6tw(-n>$suSBT|(fWcJ$|Qkr0OvxOV07*qoM6N<$f|cf2;{X5v delta 693 zcmV;m0!sbm1?UBkKYzu_)#m2*oSk!8P;=oFbsroa_Ec<_WQqWcLjHC2U!H#Yx?6f8Is{!qm?ad zG7Rr{$2;EfKSfI4%2UW=x(aFyRIlcP;fs`^HIh1-Z?gGp-MMU5#!8#=VI$>0xN+VmP{T;Z^I|43-C z)Wj_yq)Z@a?tdcG;fNb_S9rC!!m-64un3Q$Wj|_Sx@F*uppJ85_x-Q%_P8Tgcw&>N zT9V<6(} zQr*J-KF2A+*K6a`8#FO}CaAYtjSO@-1Q;!i_8JF{)5S5TMC-cE&AX>D{R;-x_XyKD z2@W_dZs+4n*(1tJYBRR)_i>VpZ zJdXGKIA-+=IN}StjQzD-;jlQ~r%a#Oo0T!O3`&PRe~${tdp)iTKAxBU`i=YRp%^nf zW-3n8rw7D5`v&mdqPH45vmm1N#zngM=XnY0qb@Zxa@YP(-AVA9M2G(RA*%nm{tx&& b{(bxa!!kBqO<;Gz00000NkvXXu0mjf4UAbw diff --git a/graphics/pokemon/slowking/galarian/overworld_normal.pal b/graphics/pokemon/slowking/galarian/overworld_normal.pal index aa19348aaa..7b64228b1d 100644 --- a/graphics/pokemon/slowking/galarian/overworld_normal.pal +++ b/graphics/pokemon/slowking/galarian/overworld_normal.pal @@ -4,16 +4,16 @@ JASC-PAL 41 194 156 49 52 74 16 129 8 -197 202 213 +182 235 136 230 230 246 156 157 115 90 80 115 189 210 139 -148 109 115 +49 52 74 98 36 74 0 0 0 131 121 139 -164 165 180 +82 64 128 131 76 106 189 174 189 131 113 180 diff --git a/graphics/pokemon/slowking/galarian/overworld_shiny.pal b/graphics/pokemon/slowking/galarian/overworld_shiny.pal index aa19348aaa..9a2bdbc76e 100644 --- a/graphics/pokemon/slowking/galarian/overworld_shiny.pal +++ b/graphics/pokemon/slowking/galarian/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 41 194 156 -49 52 74 -16 129 8 -197 202 213 +60 52 140 +166 48 112 +215 117 170 230 230 246 156 157 115 -90 80 115 +80 91 138 189 210 139 -148 109 115 -98 36 74 +49 52 74 +128 39 93 0 0 0 131 121 139 -164 165 180 -131 76 106 +82 64 128 +154 70 116 189 174 189 -131 113 180 +112 140 196 diff --git a/graphics/pokemon/slowpoke/galarian/overworld.png b/graphics/pokemon/slowpoke/galarian/overworld.png index 277a1f3a87ffd23d53bf5128ad5ad2d58f02c70d..38352ce27eaf0768de8915ee6db295d718f7735d 100644 GIT binary patch delta 541 zcmV+&0^H?@0 z)=wD@{K{4yZ*f@14EVtDHZL1ccrNjax6lljoc%e+HC7UY<-jj^jY;geT3|BBd*NMP zgdyjDOsnYGxJ9}g#US!2t4&fGsPg5^*OVePCjZRZF1piyOpEUZF~=C`*-D_#adYVL zha6*yR2G1vLA=jJ;MbfJE9X^hkpowHh%3yc4>Rafj0b*MfE1L<5@7dt&e7sEKEzZM zL2Utxv&3Apg_@il=F-|++#dI>ix{afG0|CQB|dA_z|I#nz#_ktdI@ZN`CdM<7>STa zN%DHcmG43H9z}lhQ!^;rR<8EAK#r{$ED2WL7!l;k!1h<;HHccj%i_CVD%&(y7SxTh f;r6Od{C}!1dlMOiWBjv600000NkvXXu0mjfw9^Ps delta 545 zcmV++0^a@p1cC*SHUofwfRQ;QBi$d8qyPW{2}wjjR9J=WmH}?VAPhxgr-lT$|9NK{ z5+#{|k$@S00QiVMEQI;>YB*F*f9L0?Lg$E{W5&0t>xJw8p{%-VeOS993oG@Y@En@=sdgy9+~6pGC#xIC2P1(FXNP->*#&NL0BJ6+ zF)zp#&;3%kULzJ~gT(cjMO-5?66kO>=+s|5fhre!Iv=@7QNN=5TnsMcN{>3zA0GH( zF2GV@`;_s(uWXg^R)=NGP!61K^Sl9vmlD5Z3(G*4i$4IVv5_Dy2Y$h8h-wc?f!Uz! zMR$3B7WtGCui|Ir7HM))gCwVHHc4)v!k05&V+`Dw@-u6@=uZDJdwe%YDTKh!S^{lO zn?pxG

7yvLGG}(tWN%x26kGsEfjy+!D zV~AM+%@*i!k(#TvP?d|rlv`Vh+v2Wv5fe9TCPhB0C}(XN*!f}xSoD`tD}jwK-^<4q z0~7YBNnVe*@I8p#qa<&6S_XC7!p$C6D6uVrIl;m!BSKOc-2Pg;1TpJ(S$y|PW1H&A jjG9q4Twm3Q|4;P=($g7@`2r4`00000NkvXXu0mjfH}(Q) diff --git a/graphics/pokemon/slowpoke/galarian/overworld_shiny.pal b/graphics/pokemon/slowpoke/galarian/overworld_shiny.pal index 39773f539f..ee20b05797 100644 --- a/graphics/pokemon/slowpoke/galarian/overworld_shiny.pal +++ b/graphics/pokemon/slowpoke/galarian/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -128 128 128 +152 208 160 66 63 0 -96 40 48 -173 166 8 -239 229 9 +80 72 0 +136 120 16 +171 144 18 0 0 0 -204 109 117 -240 152 160 +200 176 0 +248 216 0 160 168 176 104 80 16 208 168 96 240 216 144 232 232 248 -13 13 13 -14 14 14 -15 15 15 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/sneasel/hisuian/overworld.png b/graphics/pokemon/sneasel/hisuian/overworld.png index 7f4c335a9e8f96797384e9172ec08d38bbdc31e3..a830d0c0e8db9e6bb97665cb824e98a4b6ffd6b8 100644 GIT binary patch delta 616 zcmV-u0+;=(1@#1w7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!g~N@5TY z5JnS5VsoUVz1}%WQgK0%dyBOH|NlodVWfNB%`r;$v_a;J5Mdc%aPaC50005=NklzuU-9?SGx8XRzXSKKMAyqQA>3PW+*uz!ksWbaIfU_FR7z$5r^a=^$C%2qkAu z9aen59iu!9{!LkN4X_<%@Yo^)1(%0Ee~VOnSAW~8>nr{}Q*o{E_GSj(wrB+kE^-~R zV2_uabn0zY>>I4Ol^C_g8%BGy;vgRi=CAlp$m<&ASATPL2y`3-7(KKpZ-_7~ft9nj*UJIL9x4%c{)!Kw3Up{RAmylUrQGiVt)u(U6Lkeyc#%2Zyy#y;h3}P2sp(ulbBU-Nk5N)z+6GvPZ_tdSW z1@_;$ieWzn=_U^zs+xlp2jXrJ>dq?Hrdu5Jf&UBdXaY9;7Jj$B3Q)_;6dEa(3W1LCw~!dd+5m?yc867g=O(j zyL%8%EtW;JXq%{&RX2Z3GIWv|W_s+!eT0GEyd*P|nalw6qaXd~$I*qP@-3(8iY9#z z>qA2;^NkzOro#eR4#`qR#i&%s8(7C3HtF6FD{+~%+7O(3Nz$|f%Rk+Q(g_eadW|-< zB#*CijAG}!(SO2lH~4Unr!94-+>t_a_#n+Xj7O(-ZhX4h}dZ??lZ@tz3{UIv;2HIHXJ2N%rCd1SmMH?TIM zV&bFF6_^9JX7h|k5S#_Ln;HS@c&1FT0k)z0fNR`{7={80Vzon)Dft=w+Ni9I-3 zs;nud$bVsvZr(%C;u$wE5YC8FME&2ec&Qj~RIx|9Bm-Vz| zUA{%_zGcYL$BD%3{{{Upf~>O#2wlUTSJ9UKzZjg={{Vsr`XO>iT*?3d002ovPDHLk FV1h0cNJ{_! diff --git a/graphics/pokemon/sneasel/hisuian/overworld_normal.pal b/graphics/pokemon/sneasel/hisuian/overworld_normal.pal index e909571475..3a4e58b0eb 100644 --- a/graphics/pokemon/sneasel/hisuian/overworld_normal.pal +++ b/graphics/pokemon/sneasel/hisuian/overworld_normal.pal @@ -4,16 +4,16 @@ JASC-PAL 152 208 160 74 74 98 16 16 16 -32 24 32 +70 19 70 98 115 164 164 189 222 57 74 82 -74 49 90 +113 65 145 123 139 180 255 255 255 -90 98 106 +71 53 97 164 123 222 205 49 74 246 180 65 230 139 16 -131 148 172 +97 25 97 diff --git a/graphics/pokemon/sneasel/hisuian/overworld_shiny.pal b/graphics/pokemon/sneasel/hisuian/overworld_shiny.pal index e2b78ba441..580e24ee3e 100644 --- a/graphics/pokemon/sneasel/hisuian/overworld_shiny.pal +++ b/graphics/pokemon/sneasel/hisuian/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -82 82 82 +48 48 48 16 16 16 -189 156 49 -98 115 123 +87 68 9 +47 66 69 131 148 156 57 74 82 -230 205 82 -115 131 131 +255 212 0 +79 110 110 255 255 255 -90 82 98 +50 39 61 90 82 98 230 205 82 -156 172 238 -156 172 238 -131 148 172 +135 149 204 +112 128 193 +204 170 0 diff --git a/graphics/pokemon/sneasler/overworld.png b/graphics/pokemon/sneasler/overworld.png index 29f5dc9d48c78cf9a1a38db6c753b7240ec4aa12..b81dedda541b2316facb35115c0682b065c5e970 100644 GIT binary patch delta 865 zcmV-n1D^b)2&V^-7#0Wv0001UMu)cm0004VQb$4nuFf3kks&{SB}qg(a-Z?L*{O6ODDY4XEDr3zs?EPRt`&s z2omWghaXz#Y1fc{@Y)ER@lu|1JVQ#y4LPhOeSsH=s4<}P^ouC_Tb*kSjQJIwM{p!{ z@C_cXe;h}YXcuAMsXPg^VLhYkpfSJn9cg{N)WLI3n}fbDD0Cao*pqH@bkxEvrYM~8 zGr|`XT8HiwI(W`$-J$Ob3imhwJz4`b?+v(1U)w?^Cg?nWhmY6hIp!|!1kN~Z`!~<< z_r9@#wh?MB7;rAPcq@>S0hONuF*h3;)Hy5NIc6MFOqk z(Y8>{%Y@W_Y9k4pP&FZE653{fy#PQPw{z*I#bt+3Qv7~2cHgqQv3A@7$ES?9%pPYk=Dt}Xz9&p{DB9-rrLrrw%O4} z676os`LVm1*{&6D3O>kYKl|PH-t3z3vx zGdi5+fAL{g4YIU>0SM(NKR9cKOJKhlJARA6QeF%9PdNbFSG%r3mT@vA2xXA~jMoET zzqH1VT!STy2Jb%F+>4>G+kJol3yb%c3BpzgixL?QD_H%U<=vn&CDTt?)%(052ASK5 z-1fG$hj9pt1ok-W$Y28Go|J=ZoZ^3nyzd@lh#doaVsPR}2#W;hkbw**3E&P&=K?rl zXlGsTAajQVJht<*6L=|$1n@0`@lFCAo`cK2mHY$u#yT@Q4Vm1zO%@4ZnE+oR7LRdb*r$Y_rpi+_`=h?Yc_%&Pi%K&32rL$}Zx$NwbJL}iIf6{1z!c);yg_XRk zVee}vO|yGaiXAKK8uJovT`Y|e)G?(ow102Pg@#NRY=TKW-DRk4ltpLLYAOY=9G#h6 zFHIocnM3>8S(-N`*9j@kV{ea5%$11LJ+sO40(?uic#g6uI_j;11i6{Z zRyU;Sq?lN=p_}A#qby*p43u?qf?S`@T1n||St!|4n-+R&#C`QF)RcdW^mP_Q$$0{l z>~=dw={%^ifV}4|q3;<1WgP(Q8L1}I%H58Gu&AhSGgy?IcM>5{Gv)hJ2S+9CxOj$H9OCFJ> zXKOG;TZ56@3iunHzo80&ceJCnDGmJwpdn}BI>5>OC^n?<85Bc9tpwb*7)lEy>`XA+ zvU&{nd`_)XucT>2c>?b6%1~s(C!XHpZ=F1OQgy2xkBQ delta 21 dcmZo?X=j-b!j*4rbo}`7XOrG5Z;V^X2moG=33&hj diff --git a/graphics/pokemon/stunfisk/galarian/overworld_normal.pal b/graphics/pokemon/stunfisk/galarian/overworld_normal.pal index 9070fb58ea..5d6a48cd76 100644 --- a/graphics/pokemon/stunfisk/galarian/overworld_normal.pal +++ b/graphics/pokemon/stunfisk/galarian/overworld_normal.pal @@ -11,9 +11,9 @@ JASC-PAL 255 255 255 0 0 0 119 108 95 -111 59 50 +168 20 20 199 199 199 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +255 255 255 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/stunfisk/galarian/overworld_shiny.pal b/graphics/pokemon/stunfisk/galarian/overworld_shiny.pal index 9070fb58ea..7fe680b775 100644 --- a/graphics/pokemon/stunfisk/galarian/overworld_shiny.pal +++ b/graphics/pokemon/stunfisk/galarian/overworld_shiny.pal @@ -5,13 +5,13 @@ JASC-PAL 29 32 27 59 64 56 95 102 90 -142 172 96 -157 146 133 -205 246 140 +168 160 56 +160 128 112 +240 224 80 255 255 255 0 0 0 119 108 95 -111 59 50 +168 20 20 199 199 199 12 12 12 13 13 13 diff --git a/graphics/pokemon/weezing/galarian/overworld.png b/graphics/pokemon/weezing/galarian/overworld.png index 883a3637decdd256a36a0668c0d15aed30f5dcd0..869fd482d1af89003af74c8cd6e850de2530ff31 100644 GIT binary patch delta 1196 zcmV;d1XKHz3YH3xJOh-Gl#xFt1jV_6Q;}*Pe|SkmK~z|Ut(c3Fq#z7MMH?g9E&u~h;#4g)+dbn6;U)xxou+o1zu#};ar-Gfo;!}-Ie6Vh{l983uj{$arKov6&s7bK zr+G%>b+-L$w~E*EtlYK)w3`vo=O_A~@yjJqH%5w$4LCr3ys~lX*ASQjoTdNSjo=c{ zf5EqaMstpM2s9Lq_?;Ym%&<=2k*u29Q*|5W> z7H3@%;5ZIItEChu93yo;wsUBE_we=XoFLTnDy(%UfrF21$6=vqksMgdg%ggbO3 zUXss-fT>x)8Mg&oL@2Ucu7MH@i9^lrF2}ZkZzfndI#NzPQwUUfmjKr+;Hl(|WyCz_ zZzjQ%*W*YWDlVP9$bygpfGowr;kW{1r*IFDG8Ebcd<$%F9V%o2+!pMAgD&S5f4t_M z0|?R!N)8%e(5!$AFA35C8U>nsba)!-78qg~z?KD&^CU2aB7hD0JUKN9N(0mds&m=n zX{aO+H$5~lMF!hu{MS5tlmeh$@W9onNzf&*EKty?>T>mz1O^X)JBle`7;t=qUKb}c z1z-$X{N9FAEJk2n;>T77kk5Zwe*;l7Oc8s?O8A+F7`$IR)~5)JWql2JCLq)Wno6k0 zxydZkG*iHUUmLvT4zo*b@wZjhcfjocjRJke1J5!~GgipYNB_ee;~htji!^^**}em= zR)S2m{e=he?H8Wr7HznIPgE(wko;%Y0)Y`}S&f0k*EPR}%U zsXudm$8)3e4xgs7G97WY@rp1tn4W5(3^?x%nk8JHA8Z@Ax7^+OG})a1I$UhTJ?I8e zz6+i?Zw=_1zepjy8r*yCn9#&V-0K!OHiq|{WAq#tCKs0%9SJjo0jI+vE>jwU*ZBRG zdB<^!@Kl{hy#!ml?MGZTfA_FRfw~>40G>Iy-*Icf;CAon%$Xl{M;y0mtWI8nHoNp|YXZN0CMiy{C9^&)i63+v8 z=5E2F!mWjW@K;|P=to?QXp(i6;9ghW3Z6NxDe)cUR#)a|!11-Zf6<9bKA}qRh|7Hh z>nznbwaUp8cgZ)Vc%vyU?;8UiVE_DnANq&W6sikf#dH079@kw;6xLUc2aXVTW?GvV zBdwRIY!xq8DXJsSsL}J)>3HT@_v=Q5vKCsOl}e~~!xPct0Y?QPNE77NryBiIbF*n(Sy5{wx9Tri4^f6I&OmbqQ& zDC)$R)O@=5b)#~;NYV&)fRg75(}jVL8igXO_Tt%XOa8nb7$-KyE1`Cf>q?e-H(=Ji zqpOgqsi$c3Jw(f4|?(<5nCIe6V>{l9A9*Y#X|Ez0}zT-CsM z@*a&>Z~M1y6|d*nxa|q(HzQ!oPxSBc%VkkFMv9FMI6!^8vT^R$5tsw?(*GPra0wXT ze_KGOIY&H38VX1JE{;A*zMe6X77b7web3d=2X&+VDA2h|KL<#WQvaH_0=flk1#|;Q z5nDh3U+2kiDTm3N;$nVb{Ds`2EWk!qsTAm(^3|b(me&IM1#ATL1M~@7aM%(X4*1gJ ztSbQ=#{p>NYk|TsQWsK>7XtbPYy{W>e=Z`#=0Gij9RuLvTaSw_Px?0spwTDXp(F8< zeRc#a-2yfoiUO`86j`p+K#7ISq2+g%W7{Bf6RaE^DJP#f1ggACfa@0UQuEF-VjlH3 zlVHm0abyk+m(D?CLCgU_kz(O+TmiCExCh7?iv0q<1$MX&6^j6F3--UkkaLScfAh`( zMCk=J2MsW4RzQZA1nB^s0?j@KJP&mXjHwP_D*`Ba7MNlczy@QUotgyY0onr9xg7C4 zR2GPv9-5dUgKabZTV6cM0Z=b^;Of*Q=n_~LDCkrTxq8Y1V*tP%#gs5iI6gwJ-U-bC z7=s?ax1k)15m=V^vDE>T^Pks1f6@$7!~u#DeuPZP;6oIL(uL&;%#I`_l35_^6 znPr-03K;NfgSXsacB%PrTNQmL+z!ww&{sV2Eb}yDh5SMaKio0iarEe=h1<&Zop7}h zWUB37cqHG!^E9Wl)1k)g#^{m96htBBCtC$?I#0MHI9-UVtuC_(=WSZ1e>pil)7Yi{ z%=sP9jm|rKnkve4#@Qw)!qi}TnuRjqyft{pl|*nh4gB0@3~__6Ps|a^KxvA?>Wa9I512uE-yL~76ubehecebGz72l`z`a1 z;}#L9I*|qmwtCyoxNPpxe@lV79hv~1Il13)Yr)|55a`TV9(HFOw`#0TUYc4gp?+IF zb1IOq?}<`O$J8bP&zz##F)XC?1tHY+_snyUk*l0s5;C$TMmTe04gWdC~p4QK2kP>yuL5UOC2`Mj+Q8-sf6~qt(1nNZG-i@`sIz zOYci%0vc|*UpEpbfBtEPBfGsVI^1G`+GqruAr@P4t5AXwgP)5=k@0VNb=@+zD;-6h z7?YMS7r$;)ju%ND!46RKQenO@@KK{uWYu20xNXUw*8}6k#&{*v4su<|a_F&K*w|$B>BDw^KZY4jXW=oL%(4-ZCmFdfSH91(Sqp=dWX2d1IRb$3GSk zo6Iv2yt=Wx`*!$VIC{6T`@tl0j&(mv85jC9JP^6VtuSf5!#W3T)niQETw3$%mxr%V z-?6!V2d5No!fc?Q@2A}m!JDRLmukUeWP(68nhi8G)OwTx> z3p3|0J(}&X;eNzf%ZXeM>X!DhZs7D#t&U>cv7h@-BI`sw+4>U> z9tU>pcyQy!g@lX=6&*k&aPUj|gglVLS>O>_%)r2R7=#&*=dVZs3f}c}aSZV|{`S&o z-ev4N zhPeB!yTUqQ-B+!BjrD;Cwly;JFd2m~WGtv=%u!OFB`dPi!YL$$!`n=7PN9EJ&$Z6q z9a~wv78!m?;5*}Dc0svRw!`?>_NjBN3|5FH{8g0Mk=c;`W~cjSQ4YDswQQU@%Nwk? z)L7R@UpUO}&VD+9;k~y^erozG2ZpBsMX?OoUHdwlk|KYd|Mb#&i>S8#zxu-K46(^)D_M6d0baelF{r5}E*sK!)A` diff --git a/graphics/pokemon/yamask/galarian/overworld.png b/graphics/pokemon/yamask/galarian/overworld.png index 718654dd3829b1417b7c4934f1a10df0ebfb8a96..54276f9a041015ce66650cd9df234470c67a3a84 100644 GIT binary patch delta 36 scmX@ea*$<$t7MWvsjs_7Lqo&s*yuw$c6QX&Z?-Utw4ZQwW87m#02-zcNB{r; delta 36 scmX@ea*$<$t7N!#hOfIvLqo&s*yuw$c6QX&Z?-V|_jdQ1jd70|0U?_afB*mh diff --git a/graphics/pokemon/yamask/galarian/overworld_normal.pal b/graphics/pokemon/yamask/galarian/overworld_normal.pal index 0e81179680..af4005de75 100644 --- a/graphics/pokemon/yamask/galarian/overworld_normal.pal +++ b/graphics/pokemon/yamask/galarian/overworld_normal.pal @@ -6,14 +6,14 @@ JASC-PAL 24 24 24 56 56 56 159 83 188 -87 43 104 +98 48 117 77 71 72 128 128 128 235 93 91 194 184 185 136 126 127 179 56 54 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +255 255 255 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/yamask/galarian/overworld_shiny.pal b/graphics/pokemon/yamask/galarian/overworld_shiny.pal index 0e81179680..7cc24b4ab8 100644 --- a/graphics/pokemon/yamask/galarian/overworld_shiny.pal +++ b/graphics/pokemon/yamask/galarian/overworld_shiny.pal @@ -3,17 +3,17 @@ JASC-PAL 16 140 78 78 0 0 0 -24 24 24 -56 56 56 -159 83 188 -87 43 104 +40 40 72 +72 72 128 +24 216 152 +24 128 88 77 71 72 128 128 128 -235 93 91 +209 105 192 194 184 185 136 126 127 -179 56 54 -12 12 12 -13 13 13 -14 14 14 -15 15 15 +173 55 152 +255 255 255 +255 255 255 +255 255 255 +255 255 255 diff --git a/graphics/pokemon/yamask/galarian/shiny.pal b/graphics/pokemon/yamask/galarian/shiny.pal index 7ab1ad8cb2..276ff7ab14 100644 --- a/graphics/pokemon/yamask/galarian/shiny.pal +++ b/graphics/pokemon/yamask/galarian/shiny.pal @@ -8,10 +8,10 @@ JASC-PAL 24 128 88 24 216 152 16 64 48 -200 64 72 +173 55 152 192 184 184 224 216 216 -208 96 104 +209 105 192 144 120 136 0 0 0 0 0 0 diff --git a/graphics/pokemon/zacian/crowned_sword/overworld.png b/graphics/pokemon/zacian/crowned_sword/overworld.png index b8069ecd51e5386ff36aa8be110d183f5db769dc..887fa22ebd2b4b800d2024da826cb226cd441b2d 100644 GIT binary patch delta 1128 zcmV-u1eg2B3C0PKZGS{bL_t(oh3%M)a@;Bmg>4Uifw3+F>GbPha z;!iP0;vnoU%fIn&{Fg?gh2kIZzdfRbK>Mt4#{c$+)>0(;fJQg3$S+PRpqVFH%Q=- ztFl;k237}w*AmaTTrOTFSQh5QEc%f^p=-p2UujjClPX*}4GR3sAuY@Pj(eWB63=*( zClkb|6T~PJ41W?h@jiitk|w%c^r}mjF=$mA1wZ| zTM=>LzT3;5?IF-|->V*ZbhsbK>IvzxRz=cRdDT}utH6l*ia@@VSWR}~{R;Tz^6GFO zF?{?Ak0m;4u0nEJVWjy^aKfuT>-C7VG2ovZnEqxm>whoYcP_`3+GwQ3z+%O@bD6x< z?cfrybGG;)+r*-8l@b%3Ei&V~K6ofvgAZe)IH*hD!n*{#gKSD6goN)Fjw3Rs7){{d zQjeWSv~ICPA|5t?8E*nh6^NTxfu-}@r}u%EcN8>c@C41s8JtN54W zVZIqZReu<#qs0OdHe2p2f+Ot0?R^vD4+15%2##91Kab!c1O4O=7+#ylAIAvJ`(rm)P##gxC!K?vyiskgMZ5s903G@My`}10#}?jsL;BS?|9J= z{U-b}2e>wxs%2v?ah&L zcguj&%edmqEAilwbHX9fuDC4*t@geGn!t%)60n*asX`H`S*%oA#GA`9IPIcg6<)4J zC4b5es8cq9laIJC1m(7UtjuW{H?^x>x8E;%6}gf2zZ3T3xzks1(pt5)uY{uz;b*2tM5ZC z6-lZsBgvwb`az)tS+jGGn(&0nXXKY-P(nAV?EcQ zOn$;ad3%hQ@MDN=QMKU?s?)WI0fXrGx@~aTrX?N+ZNo*zGlF(P1|RN$gZCD1cVUnP z=wB4h5yd^cRd3;*g}&?bqAYG2Mff uCxOjxALV_XQThm*W>~6HSzey=)r*000073CIbMZGT2dL_t(oh3%M$a^xTkL~VylFc$y+x7!l<1P@6zRl8fYq%sGO zn3iaSooV{t{a!OiX7uNog0{mov0wO5{1-VA-603Nw2 zi)CkEbujRn;t`kb>}7&!VouDW9|2^#j=1nEEehA93TIB81V3{~TV;R8EzVntN4(0D z31ZX$$7Eef(wJMT6%ZtA3Sp`PqR|N7c#cHw>Z&$!qmluco zi00#Gc+AmJbrpis3?s}VzyUA%tpAV`#>RkOOz`1vCV#X3!hPd%^prv)B?cDD&Yjcb zC2u>I0UKwF535Zq`esQn(b*y+zUhO9qBW7Cu~8h<1aRR^0Nz11r4T~GyM^P3%xR1U zuye`B#v@9%SRxU33&4n1fw>68#f!k)cIqR z?r=14c{}(nFqje|QWTvFZ~ zDR;LBIK7O^&b$(LZaD`W677u3qS0*cE1&_K_$2_V!I3Hyff~h3xsEuvEQ8Z38fM}7 zYJXIs^<|9{zul|sCpaWBEy$FTXQcTkzGj_5FmKGto4%N9*>f6&rhWZWZYC1mjK9@u$n@nd=g zS%CII;XER{ho|Z#Tr@3R8*YPcgSU(8-cob*O}g{xF#!C$|AzzVm`=aB%z68I>+RER w(DWp*`t7Z}_xR12+oJZ@c#te27bwNRz_38WVanV!SFhbW PFeAaX_(H(OEEN_2CR!VT delta 60 zcmV-C0K@-|362SnIWZ|fln@*_q?sv{93bA(Ak8c})zWH8ND!>9y%;QF0000WFmsfh Stku@u&B8hDrC2kuY9s`+wHSl| diff --git a/graphics/pokemon/zamazenta/crowned_shield/overworld_normal.pal b/graphics/pokemon/zamazenta/crowned_shield/overworld_normal.pal index 54124216e5..0906c9bf94 100644 --- a/graphics/pokemon/zamazenta/crowned_shield/overworld_normal.pal +++ b/graphics/pokemon/zamazenta/crowned_shield/overworld_normal.pal @@ -6,7 +6,7 @@ JASC-PAL 16 28 57 164 153 41 148 28 32 -222 210 32 +232 48 56 205 44 57 213 210 106 74 72 16 diff --git a/graphics/pokemon/zamazenta/crowned_shield/overworld_shiny.pal b/graphics/pokemon/zamazenta/crowned_shield/overworld_shiny.pal index 54124216e5..57e6bf2744 100644 --- a/graphics/pokemon/zamazenta/crowned_shield/overworld_shiny.pal +++ b/graphics/pokemon/zamazenta/crowned_shield/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 131 129 131 -41 64 148 +200 48 104 16 28 57 164 153 41 -148 28 32 -222 210 32 -205 44 57 -213 210 106 -74 72 16 +168 48 144 +232 80 192 +232 80 192 +224 208 152 +107 67 47 172 174 189 -24 44 98 +200 48 104 0 0 0 -32 48 115 +160 40 64 148 157 172 213 214 222 -205 194 57 +192 152 96 diff --git a/graphics/pokemon/zapdos/galarian/overworld.png b/graphics/pokemon/zapdos/galarian/overworld.png index 648884dbe6a61c0b9916ec243f200c0a6fb72bb7..47321a67f4362237d457a62d1c122e39b5633277 100644 GIT binary patch delta 845 zcmV-T1G4;z2$Khp7#0Wv0001UMu)cm0004VQb$4nuFf3kks&{S5lKWrR9J=Wn2nO# zAPj_!z`_lF|L5(lu#<)#>pbnvO=p4=CzDTxl@NlvW%;yE`?OE{XD!Iz@tKV3v{?h3UDyNM|j$sd3<@}qX8TaftUI{E)o;QfRh5V zkptI!dE=u293IktiV%k|*MG^OkC!>gs~y7Qrf@aBPQrA}P2U=)A$GVZd?U9PzN_5g z7yvvXzIGqP$>Erm1Txj{ai%yq1)}vy?(wB^q)6o>1yf#1!Q`fx6&3?=9%sYaO27$b zQCY5T@(V~$aW-V7th!l*H(jO8QlCpk-wAhAOWbdArfA|6V~eoPLo>pkJj>Ga#C~^VTErcd zx}9Z@2hmK8N_7ZVxX0@d%ufhI=Xkf1d~(UbY*I6esBo+7kNDVS4PB*oIg(06^}MyE z-s4pv=7`dNBE#Jq7_Sx`7fuhdvy?|E+_3fCL7!7$&dQcE_1)snC_$WJB$#u$2K;a^ zwjBK{Hkky0NEUqWBY4e)*}}atk|}Dwj942*Phd@{AzUd7C+-_3MsJPvJQSY*m5Q%(!;2Hvn9;8&F|tXuS=0 z;%m--S;n=OQk_7O=Qaz(HX(Cxz$uVMjP$U7i#$?i;-J)ZYAba3yu%keBphR#3*Cu= ziBPA1$W1t|t!zU9_PZ=o2Th#4Ck{M$UtnHVXLQD$ybOAN3K!WX0_yKm2c=LM-b2g> z4_+qPtdntczGCnaKK-MjvFinzgBQ=A0h-Dz+pq-Y*faR*KV81-`C9CTr{ymj{D18? XtQ{NHbg64-00000NkvXXu0mjfO6i$Q delta 965 zcmV;$13LVZ2Z{)g7zqRe0002CwraMKE4AWQZd zr)!90m1b@pX2+wDQYgXOUN+VSn!fih+0*`x6}rbVw!vU~%EIW_%MypNb)|JBxonHK z65q*Av1B{C>14^4RT)|+d+LFOe|M6<)2H)&0(jHjw3lm0on`!b0_0};^#nj=OPzmV zKLC~hO+|f0L!MNp0!A$GL$QQ}%(+X92Ay%EP2UF0Fr4XR{)h&MIOQL^0uux}IpGzJ zHrxX#G8{DzfDwUrv1x_RBW`d>rH!S1nB{!7sU1fGM9oul@z~jX)+;?YJv-`*8)OF_ zwV*X`L!$Af-D8myO_>KE=a(sBG5LvcL+Y4bb4SAN}Yp)222f*HpR#ipnhoQDOPWc2sr%L_jc z$5KYaG4lXYtG3!?>*=3^q{c0abAuClbk>C=GeSC~M0%3t$ozuPOQ#k$Pf>rq{EI*xvTlaq-%Zu(^TeOi-c-T%f?*i?T*`EJ+sUG@*rr@KSp7}E{ zDwfxUXgRpUxXqo^*9g8%ZO^c`a*FIwv5Y&rV}sgk6K=kWE-ba2znl!q1v83U^)e!7 zmgO&{WP2N{gsNut{9C3S8vb2-w9f7S(dsA6n=+|~Hym?!5y^n$L7smm+pAxg?ki7O zr#Nw?x$2v*B1S(PQn)K@w9 z8b)veAtz6$z3%RYMjvcYr@C}tCL37Jo~u2u7mluv_E7HURt9nV1&5t9&dk5B)W_S& z&DDR>e>TP&u+=RLv9o_`%reMker1;|y#3QrXmRJjwz)?obE{^UN~EePs_}HIHt|*O zGl*0y{(Z1DvF<+h{E|krVL$tw?DbyZr{bqaN_&WPh)pdaMFAIGz_Cf zQcbBQ=#iQLwat`+Z?6^>qx z8$N*$>bBi>+ikbqcH94AM4NN&UsGI~@&R*Vo*na4eG4N7qo0VLIWYT~{0`=K#)%4v zLwM&U@S!qJ5PeJ`q!j8`gcY#DdL2XB2gl=_J200fPfP+0qeVhPm=oe zXUUH-c0k($qQHdZ;ouE@1t=+tePdjxCf*!x#=-+Ic?P?V1J!JRt=3osDM($7j4+kvG}3~ zJ;DGOz3y@a)bL}l^?V-m#=RQ_|q%z!ZjgjY(yQCEG6`dwyfdX_K^*+GKVS!z) z>z|Qm7@Qp-J!Q=?Rgctlu>z#v_(7Uu>A`NSHWcv57pyc!5;d^#Q~HBOlFOu%r@K@+ z&wwYn>3>5EE&(@*?xP+R^5LSfNdb89iFFELb40AY{`!8CgU~r3hUP);mgp?2Zk5DK zK#b2EYcpn91&p2>Uz}v2+5-j{B9yYDhpUq;9J226sa$odUS0ui3J|@IsOjvJnyUX6 z;QoHV5Rt6_6NhP2K0&#TYOEuCm78w#j{&FwigpR8=Bk;MM%x7qaPqz&uGKk1{d{PU zpb+rbMyLt=L_TyIPq+b2=vz;ZPrD9lE+`;b0l4e)j?t~8p#Gs87yzr>9?(*E_D`XR v0$%WIPnYrnbM>OUTxJi<k} delta 733 zcmV<30wVq12EGQ6ZGXH;L_t(oh3%GsZW|#ChR@i5Ax-oCZ@b@+cF|#=tu`&vVkP91 z-v^(;7>?s*FMHX`UiPy8#fXj&!oQ|in(+a1Vk|*qsy>C0fRQI6i$oEg$ z*{iU)`@l1T-5 zs>0)O&MU@Hnr2Ij0#_-aIq%agV4FZT4UI!+fLfKSHGj^110^D=9rVZ&P@dmkF;XaP zZZR$iTq?zs+zDI)njFwo2yy5#NbXb0}nBc1dcvI8$ zEsP7;0DnLD)H^A$ITC7%efYe|myA?^6k2>LvDglB`1gPehrlTz$TU`2157NPFHNct zB523tkfCcvH6)W1S7F?AW|!p+;9&qs@g*k%JD^Me`v4RXK@u;)2F6E#>&4awhb$vS z)jtF~Aay`>0nI|QcVD($&;iFC)E$u57M%0?npW|8#Y=jNAiVjrcOT%r15O=mpv%?2 zhxHH)kh}!E>+_DUcSQ7Xo2;d}4 diff --git a/graphics/pokemon/zigzagoon/galarian/overworld_shiny.pal b/graphics/pokemon/zigzagoon/galarian/overworld_shiny.pal index 6b74af8455..0277759a9e 100644 --- a/graphics/pokemon/zigzagoon/galarian/overworld_shiny.pal +++ b/graphics/pokemon/zigzagoon/galarian/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 52 87 191 31 43 44 36 36 36 -52 52 52 -96 101 106 -62 64 66 +82 9 36 +200 24 88 +144 8 48 163 164 163 245 245 246 0 0 0 178 179 178 -113 119 125 -238 150 178 -217 74 127 -110 59 81 +140 17 62 +152 248 240 +16 232 208 +46 79 75 64 72 80 168 184 208 diff --git a/graphics/pokemon/zorua/hisuian/overworld.png b/graphics/pokemon/zorua/hisuian/overworld.png index 9d98e3fd7af9a6d62940ded1900dca40083d2ed3..1bc82dd88a3c624983f46b21685bda34daa453a3 100644 GIT binary patch delta 649 zcmV;40(Sk)2GIqO7#0Wv0001UMu)cm0004VQb$4nuFf3kks&{SPf0{UR9J=WmeFqP zAPhvq00z_j|L?tHl6KX^kW{HuT`BHM)Z-mICYUVC6Hh$x#1l_E@x<>%yFsrcT*$Z= ze{G;m`JDEQ*DPgDuPt!Wp_}#JG;nHgo*_aU#@K!w20VlyUEdava7bJEial-#=-g!B z3gAn?;ryr6@R}HZfKiD9ju?xGgjdKSB}TZMxQfer0xUs9F%ZC}@9_n-))-orQT?RE zBaWC-p+>BlOG?iAoyS_?a`vZ`q6$EjPvIb7Tsjv%mm?-#m}`f|L?6b5QK* z$9w_HqB*P0o_@-uDC<{mZ{FPB{7pZvTR`=c4*fajOE2z!GhBfgw_Pb}+I{a1C%tp| z;@&V`7s!L<&$%U7Z%Z2spi_^_YAj6+yt#XufE{@8Po4e0!WW=fg>7KactLahiFVGLXMB-N0}2jnbw`DgD`{5Ey8rDeY~C6?1K+umVGYjp zgDD?1yDdI{<7_b7Yr_uNofO6qLxjg+!aUm?q?}XjwVz_&c)t^lTL5e)Y%r+KI8|Gp zg`-I~X1Mk!T8!bi#S0VG{Wz&xWMbf>a zJKXpanF=b`SL4Ksy>_YoTb$S;%g2A2W+pa;Ca4~(U&NNHr~@I7BiV_p91M9_`MG8v z&^JSzi01p~;M}n0jV+R;REi!fgn2z*wO7D~8CdOacm);_dA+~kHKcUYP7BQvJES_! zl3iqhGZ0sQ(G!>qBF(`e5Hpx@PCF6~+*qn-@*UczvRNRpho19V^U)2=mScZw03JEE z32)jS(44L)7@N!~7`_8p;LdtEJl||c^hT_ZNEeK3dJP%CPgCGzMape7thDI`n5sLG z?%Q>^jZFqWP?6#qA95>{aAIAFXEl=-{|J}b=`{FZ^Ocl=NB2gd;?ZmnV!b^rhX07*qoM6N<$ Ef~qNZW&i*H From a4dc9a0480cb3c1ce610540f6e2d928c4a940836 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 10 Aug 2024 16:59:23 -0500 Subject: [PATCH 065/225] Add Dowsing Machine expanded name (#5134) --- 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 daf1f9b957..f97c4670c1 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -12243,7 +12243,7 @@ const struct Item gItemsInfo[] = [ITEM_DOWSING_MACHINE] = { - .name = _("Dowsing MCHN"), + .name = HANDLE_EXPANDED_ITEM_NAME("Dowsing MCHN", "Dowsing Machine"), .price = 0, .description = COMPOUND_STRING( "A device that\n" From 77afb01477a7fd377f889fdb5d4c8feb97fadc2a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 Aug 2024 00:23:51 +0200 Subject: [PATCH 066/225] Fixes Zigzgoon battle being able to use a Gimmick (#5129) * Fixes Zigzgoon battle being able to use a Gimmick * add commit * Update src/battle_terastal.c * Update src/battle_dynamax.c --- src/battle_dynamax.c | 4 ++++ src/battle_terastal.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 06a26718a9..cdcf05f7db 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -76,6 +76,10 @@ bool32 CanDynamax(u32 battler) u16 species = gBattleMons[battler].species; u16 holdEffect = GetBattlerHoldEffect(battler, FALSE); + // Prevents Zigzagoon from dynamaxing in vanilla. + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && GetBattlerSide(battler) == B_SIDE_OPPONENT) + return FALSE; + // Check if Player has a Dynamax Band. if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT))) diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 6866c6aaad..a0580a73d2 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -63,6 +63,10 @@ bool32 CanTerastallize(u32 battler) { u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + // Prevents Zigzagoon from terastalizing in vanilla. + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && GetBattlerSide(battler) == B_SIDE_OPPONENT) + return FALSE; + if (TESTING || GetBattlerSide(battler) == B_SIDE_OPPONENT) { // Skip all other checks in this block, go to HasTrainerUsedGimmick From 527cc33e0d7ae8a338e1b410eaaa3d2e534e6fc9 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 Aug 2024 13:01:10 +0200 Subject: [PATCH 067/225] Adjusted AI calcs for Triple Kick Effect (#5127) * Adjusted AI calcs for Triple Kick Effect * use strikeCount * fix compile --- src/battle_ai_util.c | 41 +++++++++++++++++++++++++++-------------- src/battle_util.c | 5 +---- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index f138252fa8..a094dfd694 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -577,13 +577,13 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u if (critChanceIndex > 1) // Consider crit damage only if a move has at least +2 crit chance { s32 nonCritDmg = CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, - effectivenessMultiplier, weather, FALSE, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + effectivenessMultiplier, weather, FALSE, + aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], + aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); s32 critDmg = CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, - effectivenessMultiplier, weather, TRUE, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + effectivenessMultiplier, weather, TRUE, + aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], + aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); u32 critOdds = GetCritHitOdds(critChanceIndex); // With critOdds getting closer to 1, dmg gets closer to critDmg. @@ -596,20 +596,33 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u else if (critChanceIndex == -2) // Guaranteed critical { s32 critDmg = CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, - effectivenessMultiplier, weather, TRUE, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + effectivenessMultiplier, weather, TRUE, + aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], + aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); simDamage.expected = GetDamageByRollType(critDmg, rollType); simDamage.minimum = LowestRollDmg(critDmg); } else { - s32 nonCritDmg = CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, - effectivenessMultiplier, weather, FALSE, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); - + s32 nonCritDmg = 0; + if (gMovesInfo[move].effect == EFFECT_TRIPLE_KICK) + { + for (gMultiHitCounter = gMovesInfo[move].strikeCount; gMultiHitCounter > 0; gMultiHitCounter--) // The global is used to simulate actual damage done + { + nonCritDmg += CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, + effectivenessMultiplier, weather, FALSE, + aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], + aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + } + } + else + { + nonCritDmg = CalculateMoveDamageVars(move, battlerAtk, battlerDef, moveType, fixedBasePower, + effectivenessMultiplier, weather, FALSE, + aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], + aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + } simDamage.expected = GetDamageByRollType(nonCritDmg, rollType); simDamage.minimum = LowestRollDmg(nonCritDmg); } diff --git a/src/battle_util.c b/src/battle_util.c index 821f785810..329de506d5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8898,10 +8898,7 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 basePower = gBattleStruct->presentBasePower; break; case EFFECT_TRIPLE_KICK: - if (gMultiHitCounter == 0) // Calc damage with max BP for move consideration - basePower *= 6; - else - basePower *= 1 + gMovesInfo[move].strikeCount - gMultiHitCounter; + basePower *= 1 + gMovesInfo[move].strikeCount - gMultiHitCounter; break; case EFFECT_SPIT_UP: basePower = 100 * gDisableStructs[battlerAtk].stockpileCounter; From 137c15a9ceef368d18b405d0d7ef6d0390e5c702 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 Aug 2024 13:21:49 +0200 Subject: [PATCH 068/225] Clean up for #4928 (#5120) * Clean up for #4928 * agbcc * review comments * agbcc * Update src/battle_util.c --------- Co-authored-by: Bassoonian --- src/battle_util.c | 114 ++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 64 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 329de506d5..56701e2d99 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4060,6 +4060,54 @@ static inline bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) && gBattleMons[battler].hp <= cutoff); } +#define ANIM_STAT_HP 0 +#define ANIM_STAT_ATK 1 +#define ANIM_STAT_DEF 2 +#define ANIM_STAT_SPATK 3 +#define ANIM_STAT_SPDEF 4 +#define ANIM_STAT_SPEED 5 +#define ANIM_STAT_ACC 6 +#define ANIM_STAT_EVASION 7 +static void ChooseStatBoostAnimation(u32 battler) +{ + u32 stat; + bool32 statBuffMoreThan1 = FALSE; + u32 static const statsOrder[NUM_BATTLE_STATS] = + { + [ANIM_STAT_HP] = STAT_HP, + [ANIM_STAT_ATK] = STAT_ATK, + [ANIM_STAT_DEF] = STAT_DEF, + [ANIM_STAT_SPATK] = STAT_SPATK, + [ANIM_STAT_SPDEF] = STAT_SPDEF, + [ANIM_STAT_SPEED] = STAT_SPEED, + [ANIM_STAT_ACC] = STAT_ACC, + [ANIM_STAT_EVASION] = STAT_EVASION, + }; + gBattleScripting.animArg1 = 0; + + for (stat = 1; stat < NUM_BATTLE_STATS; stat++) // Start loop at 1 to avoid STAT_HP + { + if ((gQueuedStatBoosts[battler].stats & (1 << statsOrder[stat])) == 0) + continue; + + if (!statBuffMoreThan1) + statBuffMoreThan1 = ((gQueuedStatBoosts[battler].stats & (1 << statsOrder[stat])) > 1); + + if (gBattleScripting.animArg1 != 0) // Already set in a different stat so now boosting multiple stats + gBattleScripting.animArg1 = (statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS2 : STAT_ANIM_MULTIPLE_PLUS1); + else + gBattleScripting.animArg1 = GET_STAT_BUFF_ID((statsOrder[stat] + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); + } +} +#undef ANIM_STAT_HP +#undef ANIM_STAT_ATK +#undef ANIM_STAT_DEF +#undef ANIM_STAT_SPATK +#undef ANIM_STAT_SPDEF +#undef ANIM_STAT_SPEED +#undef ANIM_STAT_ACC +#undef ANIM_STAT_EVASION + u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) { u32 effect = 0; @@ -6024,40 +6072,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_OPPORTUNIST: if (gProtectStructs[battler].activateOpportunist == 2) { - bool32 statBuffMoreThan1 = FALSE; - bool32 handleSpeedAnimLater = FALSE; gBattleScripting.animArg1 = 0; gBattleScripting.battler = battler; gProtectStructs[battler].activateOpportunist--; - - for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) - { - if ((gQueuedStatBoosts[battler].stats & (1 << i)) == 0) - continue; - - if (i == STAT_SPEED) - { - handleSpeedAnimLater = TRUE; - continue; - } - - if (!statBuffMoreThan1) - statBuffMoreThan1 = ((gQueuedStatBoosts[battler].stats & (1 << i)) > 1); - - if (gBattleScripting.animArg1 != 0) //Already set in a different stat so now boosting multiple stats - gBattleScripting.animArg1 = (!statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS1 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = GET_STAT_BUFF_ID((i + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); - - } - if (handleSpeedAnimLater) - { - if (gBattleScripting.animArg1 != 0) //Already set in a different stat so now boosting multiple stats - gBattleScripting.animArg1 = (!statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS1 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = GET_STAT_BUFF_ID((STAT_SPEED + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); - } - + ChooseStatBoostAnimation(battler); BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChange); effect = 1; } @@ -7006,43 +7024,11 @@ static u8 TryConsumeMirrorHerb(u32 battler, bool32 execute) if (gProtectStructs[battler].eatMirrorHerb) { - u32 i; - bool32 statBuffMoreThan1 = FALSE; - bool32 handleSpeedAnimLater = FALSE; - gBattleScripting.animArg1 = 0; gLastUsedItem = gBattleMons[battler].item; gBattleScripting.battler = battler; gProtectStructs[battler].eatMirrorHerb = 0; - - for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) - { - if ((gQueuedStatBoosts[battler].stats & (1 << i)) == 0) - continue; - - if (i == STAT_SPEED) - { - handleSpeedAnimLater = TRUE; - continue; - } - - if (!statBuffMoreThan1) - statBuffMoreThan1 = ((gQueuedStatBoosts[battler].stats & (1 << i)) > 1); - - if (gBattleScripting.animArg1 != 0) //Already set in a different stat so now boosting multiple stats - gBattleScripting.animArg1 = (!statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS1 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = GET_STAT_BUFF_ID((i + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); - - } - if (handleSpeedAnimLater) - { - if (gBattleScripting.animArg1 != 0) //Already set in a different stat so now boosting multiple stats - gBattleScripting.animArg1 = (!statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS1 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = GET_STAT_BUFF_ID((STAT_SPEED + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); - } - + ChooseStatBoostAnimation(battler); if (execute) { BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); From 97fa0be36e3013d77400cf6572f505281bb87159 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 Aug 2024 14:18:56 +0200 Subject: [PATCH 069/225] Dynamic move type clean up (#5132) * Minor clean up of the new function DynamicMoveType * wrongly removed func * Overworld Weather Bug * wrong comparison --- include/pokemon.h | 3 +- src/pokemon.c | 108 ++++++++++++++++++++++++++++------------------ 2 files changed, 67 insertions(+), 44 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index 8337890935..2187b7ab38 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -880,7 +880,6 @@ const u8 *GetMoveName(u16 moveId); const u8 *GetMoveAnimationScript(u16 moveId); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); -u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); -u8 CalculateHiddenPowerType(struct Pokemon *mon); +u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); #endif // GUARD_POKEMON_H diff --git a/src/pokemon.c b/src/pokemon.c index 04bdfc9046..78e19dfc8b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6929,7 +6929,26 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } -u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) +static inline u32 CalculateHiddenPowerType(struct Pokemon *mon) +{ + u32 typehp; + u32 type; + u8 typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) + | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) + | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) + | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) + | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) + | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); + + type = (15 * typeBits) / 63 + 2; + if (type >= TYPE_MYSTERY) + type++; + type |= 0xC0; + typehp = type & 0x3F; + return typehp; +} + +u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) { u32 type = gMovesInfo[move].type; u32 species = GetMonData(mon, MON_DATA_SPECIES); @@ -6940,9 +6959,9 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) u32 type2 = gSpeciesInfo[species].types[1]; if (move == MOVE_IVY_CUDGEL - && (species == SPECIES_OGERPON_WELLSPRING_MASK || species == SPECIES_OGERPON_WELLSPRING_MASK_TERA - || species == SPECIES_OGERPON_HEARTHFLAME_MASK || species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA - || species == SPECIES_OGERPON_CORNERSTONE_MASK || species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA)) + && (species == SPECIES_OGERPON_WELLSPRING_MASK || species == SPECIES_OGERPON_WELLSPRING_MASK_TERA + || species == SPECIES_OGERPON_HEARTHFLAME_MASK || species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA + || species == SPECIES_OGERPON_CORNERSTONE_MASK || species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA)) { type = type2; } @@ -6980,13 +6999,13 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) else return TYPE_NORMAL; } - else if (move == MOVE_RAGING_BULL - && (species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED - || species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED - || species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) + else if (move == MOVE_RAGING_BULL + && (species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED + || species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED + || species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) { return type2; - } + } else if (move == MOVE_REVELATION_DANCE) { if (gBattleMons[battler].species != species && type1 != TYPE_MYSTERY) @@ -6994,7 +7013,7 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) else if (gBattleMons[battler].species != species && type2 != TYPE_MYSTERY) type = type2; else if (GetBattlerTeraType(battler) != TYPE_STELLAR && (GetActiveGimmick(battler) == GIMMICK_TERA || IsGimmickSelected(battler, GIMMICK_TERA))) - type = GetMonData(mon, MON_DATA_TERA_TYPE); + type = GetMonData(mon, MON_DATA_TERA_TYPE); else if (gBattleMons[battler].types[0] != TYPE_MYSTERY) type = gBattleMons[battler].types[0]; else if (gBattleMons[battler].types[1] != TYPE_MYSTERY) @@ -7002,10 +7021,10 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) else if (gBattleMons[battler].types[2] != TYPE_MYSTERY) type = gBattleMons[battler].types[2]; } - else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE - && ((IsMonGrounded(heldItemEffect, ability, type1, type2) && gBattleMons[battler].species != species) + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE + && ((IsMonGrounded(heldItemEffect, ability, type1, type2) && gBattleMons[battler].species != species) || (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY) && gBattleMons[battler].species == species))) - { + { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) @@ -7015,21 +7034,45 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) return TYPE_PSYCHIC; else //failsafe - type = TYPE_NORMAL; + type = TYPE_NORMAL; } - if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && WEATHER_HAS_EFFECT) + if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL) { - if (gBattleWeather & B_WEATHER_RAIN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) - return TYPE_WATER; - else if (gBattleWeather & B_WEATHER_SANDSTORM) - return TYPE_ROCK; - else if (gBattleWeather & B_WEATHER_SUN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) - return TYPE_FIRE; - else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) - return TYPE_ICE; + if (gMain.inBattle && WEATHER_HAS_EFFECT) + { + if (gBattleWeather & B_WEATHER_RAIN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_WATER; + else if (gBattleWeather & B_WEATHER_SANDSTORM) + return TYPE_ROCK; + else if (gBattleWeather & B_WEATHER_SUN && heldItemEffect != HOLD_EFFECT_UTILITY_UMBRELLA) + return TYPE_FIRE; + else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) + return TYPE_ICE; + else + return TYPE_NORMAL; + } else + { + switch (gWeatherPtr->currWeather) + { + case WEATHER_SUNNY: + if (heldItem != ITEM_UTILITY_UMBRELLA) + return TYPE_FIRE; + break; + case WEATHER_RAIN: + if (heldItem != ITEM_UTILITY_UMBRELLA) + return TYPE_WATER; + break; + case WEATHER_SNOW: + return TYPE_ICE; + break; + case WEATHER_SANDSTORM: + return TYPE_ROCK; + break; + } return TYPE_NORMAL; + } } if (ability == ABILITY_NORMALIZE && gMovesInfo[move].type != TYPE_NORMAL && GetActiveGimmick(battler) != GIMMICK_Z_MOVE) @@ -7055,22 +7098,3 @@ u8 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) return type; } - -u8 CalculateHiddenPowerType(struct Pokemon *mon) -{ - u32 typehp; - u32 type; - u8 typeBits = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0) - | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1) - | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2) - | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3) - | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4) - | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); - - type = (15 * typeBits) / 63 + 2; - if (type >= TYPE_MYSTERY) - type++; - type |= 0xC0; - typehp = type & 0x3F; - return typehp; -} From d1183f4b8a3d1654e2426a357815b63773f6deb2 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sun, 11 Aug 2024 08:55:51 -0700 Subject: [PATCH 070/225] Add B_SHOW_TYPES and cleaned up IsDoubleBattle (#5131) * First attempt at a port * Slightly broken but working * Got images working and opponent palettes * half finished compressed spritesheet approach instead * fix the palettes (smh) * fix hflip, and a lot of clean-up * Add B_SHOW_TYPES * Got Illusion working * Add num type enum * Updated function to get type * Fixed type icon position and cleaned up functions * Updated illusions and Tera handling * Added BATTLE_TYPE_IS_SINGLE and DOUBLE * Removed IS_BATTLE_TYPE_SINGLE * Implemented BATTLE_TYPE_IS_DOUBLE across repo * Removed SIDE macro * Updated config * Deprecated battler alive macro * Reindented file * Added exceptions for 2v1 * Replaced Fainted check with Null check * Added functionality for only types of caught mons * UseDoubleBattleCoords updated * Added ShouldFlipTypeIcon * Renamed TryLoadTypeIcon * Refactored functions * Refactored functions * Refactored functions * Refactored functions * Renamed SEEN to CAUGHT * Reset config * Added useSecondPalette and isOrdinary to gTypesInfo * Further simplified secondPalette and isOrdinary * Changed isordinary to isSpecialCase * Renamed to useSecondTypeIconPalette * Fixed Stellar type interactions * fixed spacing * fixed include/config/battle.h * fixed * fixed include/config/general.h * changed type1 and type2 * Moved IsDoubleBattle to include.battle.h Removed BATTLE_TYPE_IS_DOUBLE Removed IS_DOUBLE_BATTLE * Changed IsBattlerFainted to IsBattlerAlive * Removed IsBattlerNull * Moved GetBattlerData to be inline * Renamed GetMonDefensiveTeraType * Removed IsIllusionActive * Fixed identation * found one last isDoubleBattle hold out * fixed redundant brackets * Fixed spacing for B_SHOW_TYPES * Update src/battle_script_commands.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Fixed padding * Reindent file and refactored GetTypeIconHideMovement * Update include/data.h --------- Co-authored-by: RavePossum Co-authored-by: Frank Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- gflib/sprite.c | 2 - gflib/sprite.h | 2 + graphics/types/battle_icons1.pal | 15 + graphics/types/battle_icons1.png | Bin 0 -> 354 bytes graphics/types/battle_icons2.pal | 15 + graphics/types/battle_icons2.png | Bin 0 -> 372 bytes include/battle.h | 12 + include/battle_anim.h | 1 - include/battle_controllers.h | 5 + include/config/battle.h | 5 + include/constants/battle.h | 1 - include/data.h | 4 +- include/graphics.h | 5 + include/type_icons.h | 18 ++ src/battle_ai_main.c | 10 +- src/battle_ai_switch_items.c | 20 +- src/battle_ai_util.c | 6 +- src/battle_anim_effects_1.c | 8 +- src/battle_anim_effects_2.c | 4 +- src/battle_anim_mons.c | 7 - src/battle_anim_new.c | 22 +- src/battle_controller_opponent.c | 4 +- src/battle_controller_player.c | 20 +- src/battle_controllers.c | 8 +- src/battle_gfx_sfx_util.c | 2 +- src/battle_gimmick.c | 8 +- src/battle_main.c | 6 +- src/battle_message.c | 10 +- src/battle_script_commands.c | 73 +++-- src/battle_terastal.c | 2 +- src/battle_util.c | 22 +- src/battle_util2.c | 2 +- src/data/types_info.h | 42 +++ src/graphics.c | 6 + src/party_menu.c | 2 +- src/pokemon.c | 2 +- src/tv.c | 2 +- src/type_icons.c | 516 +++++++++++++++++++++++++++++++ 38 files changed, 758 insertions(+), 131 deletions(-) create mode 100644 graphics/types/battle_icons1.pal create mode 100644 graphics/types/battle_icons1.png create mode 100644 graphics/types/battle_icons2.pal create mode 100644 graphics/types/battle_icons2.png create mode 100644 include/type_icons.h create mode 100644 src/type_icons.c diff --git a/gflib/sprite.c b/gflib/sprite.c index 7823888cb5..9ba1662c9d 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -52,7 +52,6 @@ static void SortSprites(u32 *spritePriorities, s32 n); static u32 CreateSpriteAt(u32 index, const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority); static void ResetOamMatrices(void); static void ResetSprite(struct Sprite *sprite); -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); static void ResetAllSprites(void); static void BeginAnim(struct Sprite *sprite); static void ContinueAnim(struct Sprite *sprite); @@ -75,7 +74,6 @@ static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); static u8 GetSpriteMatrixNum(struct Sprite *sprite); -static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); static void AffineAnimStateRestartAnim(u8 matrixNum); static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); static void AffineAnimStateReset(u8 matrixNum); diff --git a/gflib/sprite.h b/gflib/sprite.h index 6a3084add2..937ed42ced 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -331,5 +331,7 @@ u8 SpriteTileAllocBitmapOp(u16 bit, u8 op); void ClearSpriteCopyRequests(void); void ResetAffineAnimData(void); u32 GetSpanPerImage(u32 shape, u32 size); +void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); +void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); #endif //GUARD_SPRITE_H diff --git a/graphics/types/battle_icons1.pal b/graphics/types/battle_icons1.pal new file mode 100644 index 0000000000..972dfd02af --- /dev/null +++ b/graphics/types/battle_icons1.pal @@ -0,0 +1,15 @@ +JASC-PAL +0100 +12 +120 152 128 +49 49 49 +255 255 255 +164 82 57 +172 189 32 +184 160 90 +213 180 90 +98 98 180 +180 90 164 +172 164 148 +172 172 197 +152 172 246 diff --git a/graphics/types/battle_icons1.png b/graphics/types/battle_icons1.png new file mode 100644 index 0000000000000000000000000000000000000000..c47b07f1171a309220fe403e7ed17b544dce61b2 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^96-E)gBeJ&&AV#_q!^2X+?^QKos)S9f0+Ah^6AeDr5qSvozYT0U{!x$`s_r#^L~O? zW`;68@OaH&_v*B4*$Iv5&s|*w(yuXeG{_swkC``BYN3?2$6ECzR%;a2T$7x3-fpK2 zw`)VQ%vH99|B6*k<|Py^@Yg%OV literal 0 HcmV?d00001 diff --git a/graphics/types/battle_icons2.pal b/graphics/types/battle_icons2.pal new file mode 100644 index 0000000000..bddf49ad95 --- /dev/null +++ b/graphics/types/battle_icons2.pal @@ -0,0 +1,15 @@ +JASC-PAL +0100 +12 +120 152 128 +49 49 49 +255 255 255 +240 82 48 +120 200 80 +248 197 49 +80 120 136 +123 98 230 +248 115 164 +57 156 255 +90 205 230 +246 180 246 diff --git a/graphics/types/battle_icons2.png b/graphics/types/battle_icons2.png new file mode 100644 index 0000000000000000000000000000000000000000..44aa4f89547f478a290231112e03bd84f350a08e GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^96-E)gBeJ&&AV#_q!^2X+?^QKos)S9%Lb!>Ej>Uc_m{DK*PN@0NW zNPrqp{F$eVV~9oX*+~b5njCnX4YfG_{QrMTEphh)*Y7EA%lmU~y*2PL&)#)cl~Kxp z!IERaWLAYID;xWC%9j?$eC*AdA1ZV};4{aCCrl!1c&{l7|6f;|Grv9M#7Uhdjs6y$ zGhY@M>?)gc>-e`yFYyM(vV;e(KVEcyW|W>Ye|kyVjwuaK7z8*qp3hmScV6;#`s8yB zY&Rw}_zHyodQqSi96QT++j%9)ga_;kyc`1Lo)&ZKm)+^(*_kc*uP*H+Qv<_C?~dro zBk$AS%{>(|{aMf3&E9MR8$NG+Qmi1Wad_8vzv-E=vp%1;t6yfmv6;^}dj^LH(8mm( Lu6{1-oD!MaiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsAiVsAiBattle()) + else if (IsDoubleBattle() && IsAiVsAiBattle()) { AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_RIGHT] = AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_LEFT]; } @@ -275,7 +275,7 @@ u32 BattleAI_ChooseMoveOrAction(void) { u32 ret; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) ret = ChooseMoveOrAction_Singles(sBattler_AI); else ret = ChooseMoveOrAction_Doubles(sBattler_AI); @@ -323,7 +323,7 @@ void Ai_InitPartyStruct(void) // Save first 2 or 4(in doubles) mons CopyBattlerDataToAIParty(B_POSITION_PLAYER_LEFT, B_SIDE_PLAYER); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) CopyBattlerDataToAIParty(B_POSITION_PLAYER_RIGHT, B_SIDE_PLAYER); // If player's partner is AI, save opponent mons @@ -2050,7 +2050,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } /*if (AI_THINKING_STRUCT->aiFlags[battlerAtk] == AI_SCRIPT_CHECK_BAD_MOVE //Only basic AI - && IS_DOUBLE_BATTLE) //Make the regular AI know how to use Protect minimally in Doubles + && IsDoubleBattle()) //Make the regular AI know how to use Protect minimally in Doubles { u8 shouldProtect = ShouldProtect(battlerAtk, battlerDef, move); if (shouldProtect == USE_PROTECT || shouldProtect == PROTECT_FROM_FOES) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index ef35a95f59..966082f32f 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -82,7 +82,7 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) return FALSE; opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); @@ -242,7 +242,7 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler, bool32 emitResult) struct Pokemon *party = NULL; u16 move; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) return FALSE; opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); @@ -318,7 +318,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler, bool32 emitResult) if (IS_MOVE_STATUS(gLastLandedMoves[battler])) return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerIn1 = battler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) @@ -707,7 +707,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) } } } - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) return FALSE; opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition)); @@ -765,7 +765,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 modu if (IS_MOVE_STATUS(gLastLandedMoves[battler])) return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerIn1 = battler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) @@ -846,7 +846,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) // Battler will faint to hazards, check to see if another mon can clear them if (hazardDamage > battlerHp) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerIn1 = battler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) @@ -1023,7 +1023,7 @@ bool32 ShouldSwitch(u32 battler, bool32 emitResult) availableToSwitch = 0; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerIn1 = battler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) @@ -1140,7 +1140,7 @@ void AI_TrySwitchOrUseItem(u32 battler) s32 monToSwitchId = AI_DATA->mostSuitableMonId[battler]; if (monToSwitchId == PARTY_SIZE) { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) { battlerIn1 = GetBattlerAtPosition(battlerPosition); battlerIn2 = battlerIn1; @@ -2040,7 +2040,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return gBattlerPartyIndexes[battler] + 1; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerIn1 = battler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) @@ -2074,7 +2074,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) // Split ideal mon decision between after previous mon KO'd (prioritize offensive options) and after switching active mon out (prioritize defensive options), and expand the scope of both. // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchAfterMonKOd); return bestMonId; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 2af88bea8c..26950882f1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3026,7 +3026,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) else party = gEnemyParty; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; @@ -3417,7 +3417,7 @@ s32 CountUsablePartyMons(u32 battlerId) else party = gEnemyParty; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; @@ -3828,7 +3828,7 @@ bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move) bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { // simple logic. just upgrades chosen move to z move if possible, unless regular move would kill opponent - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && battlerDef == BATTLE_PARTNER(battlerAtk)) + if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk)) return FALSE; // don't use z move on partner if (HasTrainerUsedGimmick(battlerAtk, GIMMICK_Z_MOVE)) return FALSE; // can't use z move twice diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index b917cdc9a5..a852033133 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -3317,7 +3317,7 @@ static void AnimSolarBeamSmallOrb(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gAnimMoveIndex == MOVE_CORE_ENFORCER) + if (IsDoubleBattle() && gAnimMoveIndex == MOVE_CORE_ENFORCER) { CoreEnforcerLoadBeamTarget(sprite); } @@ -6567,11 +6567,11 @@ void PrepareDoubleTeamAnim(u32 taskId, u32 animBattler, bool32 forAllySwitch) gSprites[spriteId].sBattlerFlank = (animBattler != ANIM_ATTACKER); else gSprites[spriteId].sBattlerFlank = (animBattler == ANIM_ATTACKER); - + // correct direction on opponent side if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) gSprites[spriteId].sBattlerFlank ^= 1; - + gSprites[spriteId].callback = AnimDoubleTeam; task->tBlendSpritesCount++; } @@ -6603,7 +6603,7 @@ static void ReloadBattlerSprites(u32 battler, struct Pokemon *party) UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); // If battler has an indicator for a gimmick, hide the sprite until the move animation finishes. UpdateIndicatorVisibilityAndType(gHealthboxSpriteIds[battler], TRUE); - + // Try to recreate shadow sprite if (gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId < MAX_SPRITES) { diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 3324d276fd..b33c0a8bb6 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1726,7 +1726,7 @@ void AnimTask_AirCutterProjectile(u8 taskId) attackerX = gTasks[taskId].data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); attackerY = gTasks[taskId].data[10] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) { SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &targetX, &targetY); @@ -3854,7 +3854,7 @@ static void AnimPerishSongMusicNote_Step2(struct Sprite *sprite) static void AnimGuardRing(struct Sprite *sprite) { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) + if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) { SetAverageBattlerPositions(gBattleAnimAttacker, FALSE, &sprite->x, &sprite->y); sprite->y += 40; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 73c1e99448..e0b4820409 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -17,8 +17,6 @@ #include "util.h" #include "constants/battle_anim.h" -#define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - extern const struct OamData gOamData_AffineNormal_ObjNormal_64x64; static void AnimTranslateLinear_WithFollowup_SetCornerVecX(struct Sprite *sprite); @@ -868,11 +866,6 @@ bool8 IsBattlerSpritePresent(u8 battlerId) } } -bool8 IsDoubleBattle(void) -{ - return IS_DOUBLE_BATTLE(); -} - #define BG_ANIM_PAL_1 8 #define BG_ANIM_PAL_2 9 #define BG_ANIM_PAL_CONTEST 14 diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index f023859b59..e03ad2ace6 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -7250,7 +7250,7 @@ static u8 LoadBattleAnimTarget(u8 arg) { u8 battler; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { switch (gBattleAnimArgs[arg]) { @@ -7281,7 +7281,7 @@ static u8 LoadBattleAnimTarget(u8 arg) static u8 GetProperCentredCoord(u8 battler, u8 coordType) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) return (GetBattlerSpriteCoord2(battler, coordType) + GetBattlerSpriteCoord2(BATTLE_PARTNER(battler), coordType)) / 2; return GetBattlerSpriteCoord(battler, coordType); @@ -7471,14 +7471,14 @@ static void SpriteCB_SpriteToCentreOfSide(struct Sprite *sprite) if (gBattleAnimArgs[2] == 0) //Attacker { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, var); else InitSpritePosToAnimAttacker(sprite, var); } else { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimTargetsCentre(sprite, var); else InitSpritePosToAnimTarget(sprite, var); @@ -7562,7 +7562,7 @@ static void SpriteCB_GrowingSuperpower(struct Sprite *sprite) static void SpriteCB_CentredSpiderWeb(struct Sprite *sprite) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); @@ -7576,14 +7576,14 @@ static void SpriteCB_CoreEnforcerHits(struct Sprite *sprite) if (gBattleAnimArgs[2] == 0) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); else InitSpritePosToAnimAttacker(sprite, FALSE); } else { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); @@ -7595,7 +7595,7 @@ static void SpriteCB_CoreEnforcerHits(struct Sprite *sprite) static void SpriteCB_CoreEnforcerBeam(struct Sprite *sprite) { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) { AnimSolarBeamBigOrb(sprite); } @@ -7867,14 +7867,14 @@ void SpriteCB_RandomCentredHits(struct Sprite *sprite) if (gBattleAnimArgs[0] == 0) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); else InitSpritePosToAnimAttacker(sprite, FALSE); } else { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); @@ -8179,7 +8179,7 @@ static void SpriteCB_BeamUpStep(struct Sprite *sprite) static void SpriteCB_CentredElectricity(struct Sprite *sprite) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index a5dc6f3af1..b555711933 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -581,7 +581,7 @@ static void OpponentHandleChooseMove(u32 battler) if (GetBattlerMoveTargetType(battler, move) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (battler << 8)); - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle()) { do { target = GetBattlerAtPosition(Random() & 2); @@ -653,7 +653,7 @@ static void OpponentHandleChoosePokemon(u32 battler) { s32 battler1, battler2, firstId, lastId; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) { battler2 = battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 5dae29563d..8760252c67 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -44,6 +44,7 @@ #include "level_caps.h" #include "menu.h" #include "pokemon_summary_screen.h" +#include "type_icons.h" static void PlayerBufferExecCompleted(u32 battler); static void PlayerHandleLoadMonSprite(u32 battler); @@ -59,7 +60,6 @@ static void PlayerHandlePrintString(u32 battler); static void PlayerHandlePrintSelectionString(u32 battler); static void PlayerHandleChooseAction(u32 battler); static void PlayerHandleYesNoBox(u32 battler); -static void PlayerHandleChooseMove(u32 battler); static void PlayerHandleChooseItem(u32 battler); static void PlayerHandleChoosePokemon(u32 battler); static void PlayerHandleCmd23(u32 battler); @@ -81,14 +81,11 @@ static void PlayerHandleEndLinkBattle(u32 battler); static void PlayerHandleBattleDebug(u32 battler); static void PlayerBufferRunCommand(u32 battler); -static void HandleInputChooseTarget(u32 battler); -static void HandleInputChooseMove(u32 battler); static void MoveSelectionDisplayPpNumber(u32 battler); static void MoveSelectionDisplayPpString(u32 battler); static void MoveSelectionDisplayMoveType(u32 battler); static void MoveSelectionDisplayMoveNames(u32 battler); static void MoveSelectionDisplayMoveDescription(u32 battler); -static void HandleMoveSwitching(u32 battler); static void SwitchIn_HandleSoundAndEnd(u32 battler); static void WaitForMonSelection(u32 battler); static void CompleteWhenChoseItem(u32 battler); @@ -382,7 +379,7 @@ static void HandleInputChooseAction(u32 battler) } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle() && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -426,7 +423,7 @@ static void HandleInputChooseAction(u32 battler) } } -static void HandleInputChooseTarget(u32 battler) +void HandleInputChooseTarget(u32 battler) { s32 i; static const u8 identities[MAX_BATTLERS_COUNT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; @@ -662,7 +659,7 @@ static void TryShowAsTarget(u32 battler) } } -static void HandleInputChooseMove(u32 battler) +void HandleInputChooseMove(u32 battler) { u16 moveTarget; u32 canSelectTarget = 0; @@ -968,7 +965,7 @@ static u32 UNUSED HandleMoveInputUnused(u32 battler) return var; } -static void HandleMoveSwitching(u32 battler) +void HandleMoveSwitching(u32 battler) { u8 perMovePPBonuses[MAX_MON_MOVES]; struct ChooseMoveStruct moveStruct; @@ -1757,7 +1754,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) } else { - end = StringCopy(txtPtr, gTypesInfo[type].name); + end = StringCopy(txtPtr, gTypesInfo[type].name); } PrependFontIdToFit(txtPtr, end, FONT_NORMAL, WindowWidthPx(B_WIN_MOVE_TYPE) - 25); @@ -2075,7 +2072,7 @@ static void PlayerHandleYesNoBox(u32 battler) } } -static void HandleChooseMoveAfterDma3(u32 battler) +void HandleChooseMoveAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) { @@ -2097,7 +2094,7 @@ static void PlayerChooseMoveInBattlePalace(u32 battler) } } -static void PlayerHandleChooseMove(u32 battler) +void PlayerHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { @@ -2125,6 +2122,7 @@ static void PlayerHandleChooseMove(u32 battler) void InitMoveSelectionsVarsAndStrings(u32 battler) { + LoadTypeIcons(battler); MoveSelectionDisplayMoveNames(battler); gMultiUsePlayerCursor = 0xFF; MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index fae42939d0..e11406831b 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -175,7 +175,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerPartyIndexes[3] = 3; } } - else if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + else if (!IsDoubleBattle()) { gBattleMainFunc = BeginBattleIntro; @@ -417,7 +417,7 @@ static void InitLinkBtlControllers(void) s32 i; u8 multiplayerId; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) { if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) { @@ -442,7 +442,7 @@ static void InitLinkBtlControllers(void) gBattlersCount = 2; } } - else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle()) { if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) { @@ -610,7 +610,7 @@ static void InitLinkBtlControllers(void) bool32 IsValidForBattle(struct Pokemon *mon) { u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); - return (species != SPECIES_NONE + return (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(mon, MON_DATA_HP) != 0 && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index cb3349ee32..b396f1d7b5 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -309,7 +309,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move) static u16 GetBattlePalaceTarget(u32 battler) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { u8 opposing1, opposing2; diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index c8ee932218..2595e4cbda 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -96,7 +96,7 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) { // Check whether partner battler has used gimmick or plans to during turn. - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler) && (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] || ((gBattleStruct->gimmick.toActivate & gBitTable[BATTLE_PARTNER(battler)] @@ -115,7 +115,7 @@ bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) void SetGimmickAsActivated(u32 battler, enum Gimmick gimmick) { gBattleStruct->gimmick.activated[battler][gimmick] = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsPartnerMonFromSameTrainer(battler)) + if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler)) gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] = TRUE; } @@ -155,7 +155,7 @@ void CreateGimmickTriggerSprite(u32 battler) if (gBattleStruct->gimmick.triggerSpriteId == 0xFF) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) gBattleStruct->gimmick.triggerSpriteId = CreateSprite(gimmick->triggerTemplate, gSprites[gHealthboxSpriteIds[battler]].x - DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE, gSprites[gHealthboxSpriteIds[battler]].y - DOUBLES_GIMMICK_TRIGGER_POS_Y_DIFF, 0); @@ -204,7 +204,7 @@ static void SpriteCb_GimmickTrigger(struct Sprite *sprite) s32 xSlide, xPriority, xOptimal; s32 yDiff; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { xSlide = DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE; xPriority = DOUBLES_GIMMICK_TRIGGER_POS_X_PRIORITY; diff --git a/src/battle_main.c b/src/battle_main.c index 23047107b8..54da8223af 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4136,7 +4136,7 @@ void SwitchPartyOrder(u32 battler) partyId2 = GetPartyIdFromBattlePartyId(*(gBattleStruct->monToSwitchIntoId + battler)); SwitchPartyMonSlots(partyId1, partyId2); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) { @@ -4277,7 +4277,7 @@ static void HandleTurnActionSelectionState(void) i); } - BtlController_EmitChooseMove(battler, BUFFER_A, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); + BtlController_EmitChooseMove(battler, BUFFER_A, IsDoubleBattle() != 0, FALSE, &moveInfo); MarkBattlerForControllerExec(battler); } break; @@ -4570,7 +4570,7 @@ static void HandleTurnActionSelectionState(void) else i = FALSE; - if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !IsDoubleBattle()) || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])) { diff --git a/src/battle_message.c b/src/battle_message.c index 87ac5326fb..b1c536b865 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2826,7 +2826,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) stringPtr = sText_LegendaryPkmnAppeared; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]])) + else if (IsDoubleBattle() && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]])) stringPtr = sText_TwoWildPkmnAppeared; else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) stringPtr = sText_WildPkmnAppearedPause; @@ -2837,7 +2837,7 @@ void BufferStringBattle(u16 stringID, u32 battler) case STRINGID_INTROSENDOUT: // poke first send-out if (GetBattlerSide(battler) == B_SIDE_PLAYER) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsValidForBattle(&gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]])) + if (IsDoubleBattle() && IsValidForBattle(&gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]])) { if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) stringPtr = sText_InGamePartnerSentOutZGoN; @@ -2855,7 +2855,7 @@ void BufferStringBattle(u16 stringID, u32 battler) } else { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]])) + if (IsDoubleBattle() && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]])) { if (BATTLE_TWO_VS_ONE_OPPONENT) stringPtr = sText_Trainer1SentOutTwoPkmn; @@ -2886,7 +2886,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (*(&gBattleStruct->hpScale) == 0) stringPtr = sText_PkmnThatsEnough; - else if (*(&gBattleStruct->hpScale) == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (*(&gBattleStruct->hpScale) == 1 || IsDoubleBattle()) stringPtr = sText_PkmnComeBack; else if (*(&gBattleStruct->hpScale) == 2) stringPtr = sText_PkmnOkComeBack; @@ -2911,7 +2911,7 @@ void BufferStringBattle(u16 stringID, u32 battler) case STRINGID_SWITCHINMON: // switch-in msg if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER) { - if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (*(&gBattleStruct->hpScale) == 0 || IsDoubleBattle()) stringPtr = sText_GoPkmn2; else if (*(&gBattleStruct->hpScale) == 1) stringPtr = sText_DoItPkmn; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 575e1cd043..396521f5a0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1752,7 +1752,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u return; } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && + if (IsDoubleBattle() && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; else @@ -2498,7 +2498,7 @@ static void Cmd_resultmessage(void) if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { if (gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up - CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); + CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, (IsDoubleBattle()) != 0); stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; gBattleCommunication[MSG_DISPLAY] = 1; } @@ -4352,7 +4352,7 @@ static void Cmd_getexp(void) { // 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)) + && (gBattleMons[0].hp || (IsDoubleBattle() && gBattleMons[2].hp)) && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) && !gBattleStruct->wildVictorySong) @@ -4403,7 +4403,7 @@ static void Cmd_getexp(void) } // get exp getter battler - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { if (gBattlerPartyIndexes[2] == *expMonId && !(gAbsentBattlerFlags & gBitTable[2])) gBattleStruct->expGetterBattlerId = 2; @@ -4483,7 +4483,7 @@ static void Cmd_getexp(void) // update battle mon structure after level up if (gBattlerPartyIndexes[0] == *expMonId && gBattleMons[0].hp) battler = 0; - else if (gBattlerPartyIndexes[2] == *expMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + else if (gBattlerPartyIndexes[2] == *expMonId && gBattleMons[2].hp && (IsDoubleBattle())) battler = 2; if (battler != 0xFF) @@ -5919,7 +5919,7 @@ static void Cmd_moveend(void) gBattleStruct->targetsDone[gBattlerAttacker] |= gBitTable[gBattlerTarget]; if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && IsDoubleBattle() && !gProtectStructs[gBattlerAttacker].chargingTurn && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY) @@ -6689,7 +6689,7 @@ bool32 CanBattlerSwitch(u32 battler) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else battlerIn2 = battlerIn1; @@ -6701,7 +6701,7 @@ bool32 CanBattlerSwitch(u32 battler) // Check if attacker side has mon to switch into battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); else battlerIn2 = battlerIn1; @@ -6765,7 +6765,7 @@ static void Cmd_openpartyscreen(void) if (cmd->battler == BS_FAINTED_MULTIPLE_1) { - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !(IsDoubleBattle())) { for (battler = 0; battler < gBattlersCount; battler++) { @@ -6791,7 +6791,7 @@ static void Cmd_openpartyscreen(void) } } } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle()) { bool8 hasReplacement_0, hasReplacement_1, hasReplacement_2, hasReplacement_3; @@ -6922,7 +6922,7 @@ static void Cmd_openpartyscreen(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { hitmarkerFaintBits = gHitMarker >> 28; if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) @@ -7466,7 +7466,7 @@ static void Cmd_handlelearnnewmove(void) { GiveMoveToBattleMon(&gBattleMons[battler], learnMove); } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { battler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); if (gBattlerPartyIndexes[battler] == monId @@ -7572,7 +7572,7 @@ static void Cmd_yesnoboxlearnmove(void) RemoveBattleMonPPBonus(&gBattleMons[0], movePosition); SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition); } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + if (IsDoubleBattle() && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && MOVE_IS_PERMANENT(2, movePosition)) { @@ -7686,7 +7686,7 @@ static u32 GetTrainerMoneyToGive(u16 trainerId) if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * trainerMoney; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle()) moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * trainerMoney; else moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * trainerMoney; @@ -8352,7 +8352,7 @@ static bool32 IsMonGettingExpSentOut(void) { if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) return TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) + if (IsDoubleBattle() && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) return TRUE; return FALSE; @@ -8425,7 +8425,7 @@ static void Cmd_hpthresholds(void) { CMD_ARGS(u8 battler); - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!(IsDoubleBattle())) { u32 battler = GetBattlerForBattleScript(cmd->battler); u32 opposingBattler = BATTLE_OPPOSITE(battler); @@ -8451,7 +8451,7 @@ static void Cmd_hpthresholds2(void) { CMD_ARGS(u8 battler); - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!(IsDoubleBattle())) { u32 battler = GetBattlerForBattleScript(cmd->battler); u32 opposingBattler = BATTLE_OPPOSITE(battler); @@ -9931,7 +9931,7 @@ static void Cmd_various(void) case VARIOUS_ABILITY_POPUP: { VARIOUS_ARGS(); - CreateAbilityPopUp(battler, gBattleMons[battler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); + CreateAbilityPopUp(battler, gBattleMons[battler].ability, (IsDoubleBattle()) != 0); break; } case VARIOUS_UPDATE_ABILITY_POPUP: @@ -10125,7 +10125,7 @@ static void Cmd_various(void) gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = 5; gSideTimers[GetBattlerSide(battler)].auroraVeilBattlerId = battler; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = 5; else gBattleCommunication[MULTISTRING_CHOOSER] = 5; @@ -10301,7 +10301,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_TEAM_HEALTHY: { VARIOUS_ARGS(const u8 *jumpInstr); - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerAlive(BATTLE_PARTNER(battler))) + if ((IsDoubleBattle()) && IsBattlerAlive(BATTLE_PARTNER(battler))) { u8 partner = BATTLE_PARTNER(battler); if ((gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) @@ -10914,7 +10914,7 @@ static void Cmd_various(void) PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gSelectedMonPartyId], MON_DATA_SPECIES)); // If an on-field battler is revived, it needs to be sent out again. - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && + if (IsDoubleBattle() && gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)] == gSelectedMonPartyId) { gBattleScripting.battler = BATTLE_PARTNER(gBattlerAttacker); @@ -11233,7 +11233,7 @@ static void Cmd_setreflect(void) gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; @@ -12097,7 +12097,7 @@ static void Cmd_forcerandomswitch(void) battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; battler1PartyId = gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerTarget)]; } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle()) { firstMonId = 0; lastMonId = PARTY_SIZE; @@ -12295,7 +12295,7 @@ static void Cmd_setlightscreen(void) gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; @@ -12465,7 +12465,7 @@ static void Cmd_updatestatusicon(void) BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); MarkBattlerForControllerExec(battler); } - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if ((IsDoubleBattle())) { battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (!(gAbsentBattlerFlags & gBitTable[battler])) @@ -12502,7 +12502,7 @@ static void Cmd_setfocusenergy(void) CMD_ARGS(u8 battler); u8 battler = GetBattlerForBattleScript(cmd->battler); - if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || (gAbsentBattlerFlags & gBitTable[battler]))) + if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & gBitTable[battler]))) || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) { gMoveResultFlags |= MOVE_RESULT_FAILED; @@ -13245,7 +13245,7 @@ static void Cmd_healpartystatus(void) gBattleMons[gBattlerAttacker].status1 = 0; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + if (IsDoubleBattle() && !(gAbsentBattlerFlags & gBitTable[partner])) { gBattleMons[partner].status1 = 0; @@ -14088,7 +14088,7 @@ static void Cmd_trysethelpinghand(void) gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + if (IsDoubleBattle() && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) && !gProtectStructs[gBattlerAttacker].helpingHand && !gProtectStructs[gBattlerTarget].helpingHand) @@ -14910,7 +14910,7 @@ static void Cmd_pursuitdoubles(void) u32 battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + if (IsDoubleBattle() && !(gAbsentBattlerFlags & gBitTable[battler]) && gChosenActionByBattler[battler] == B_ACTION_USE_MOVE && gMovesInfo[gChosenMoveByBattler[battler]].effect == EFFECT_PURSUIT) @@ -15908,7 +15908,7 @@ bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler) && gMovesInfo[move].strikeCount < 2 && gMovesInfo[move].effect != EFFECT_MULTI_HIT) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { switch (GetBattlerMoveTargetType(battler, move)) { @@ -16025,7 +16025,7 @@ void BS_SetZEffect(void) static void TryUpdateRoundTurnOrder(void) { - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { u32 i; u32 j = 0; @@ -16163,8 +16163,7 @@ void BS_ItemRestoreHP(void) // Check if the recipient is an active battler. if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) battler = gBattlerAttacker; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) battler = BATTLE_PARTNER(gBattlerAttacker); // Get amount to heal. @@ -16201,7 +16200,7 @@ void BS_ItemRestoreHP(void) SetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP, &hp); // Revived battlers on the field need to be brought back. - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && battler != MAX_BATTLERS_COUNT) + if (IsDoubleBattle() && battler != MAX_BATTLERS_COUNT) { gAbsentBattlerFlags &= ~gBitTable[battler]; gBattleMons[battler].hp = hp; @@ -16227,7 +16226,7 @@ void BS_ItemCureStatus(void) previousStatus2 = gBattleMons[battler].status2; gBattleMons[gBattlerAttacker].status2 &= ~GetItemStatus2Mask(gLastUsedItem); } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) { battler = BATTLE_PARTNER(gBattlerAttacker); @@ -16292,7 +16291,7 @@ void BS_ItemRestorePP(void) // Check if the recipient is an active battler. if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) battler = gBattlerAttacker; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) battler = BATTLE_PARTNER(gBattlerAttacker); @@ -16623,7 +16622,7 @@ void BS_SetPledge(void) gBattleCommunication[MSG_DISPLAY] = 0; } else if ((gChosenActionByBattler[partner] == B_ACTION_USE_MOVE) - && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && IsDoubleBattle() && IsBattlerAlive(partner) && gCurrentMove != partnerMove && gMovesInfo[partnerMove].effect == EFFECT_PLEDGE) diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 6866c6aaad..c0540f5aa3 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -30,7 +30,7 @@ void ActivateTera(u32 battler) if (B_FLAG_TERA_ORB_CHARGED != 0 && (B_FLAG_TERA_ORB_NO_COST == 0 || !FlagGet(B_FLAG_TERA_ORB_NO_COST)) && side == B_SIDE_PLAYER - && !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !IsPartnerMonFromSameTrainer(battler))) + && !(IsDoubleBattle() && !IsPartnerMonFromSameTrainer(battler))) { FlagClear(B_FLAG_TERA_ORB_CHARGED); } diff --git a/src/battle_util.c b/src/battle_util.c index 3d9338acee..24095c08ed 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -221,7 +221,7 @@ void HandleAction_UseMove(void) { gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix } - else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle() && gSideTimers[side].followmeTimer == 0 && (gMovesInfo[gCurrentMove].power != 0 || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS)) && ((GetBattlerAbility(*(gBattleStruct->moveTarget + gBattlerAttacker)) != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) @@ -305,8 +305,7 @@ void HandleAction_UseMove(void) gBattlerTarget = battler; } } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && moveTarget & MOVE_TARGET_RANDOM) + else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { @@ -336,8 +335,7 @@ void HandleAction_UseMove(void) else gBattlerTarget = gBattlerAttacker; } - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && moveTarget == MOVE_TARGET_FOES_AND_ALLY) + else if (IsDoubleBattle() && moveTarget == MOVE_TARGET_FOES_AND_ALLY) { for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { @@ -3744,7 +3742,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 u32 i, side, playerId, flankId; struct Pokemon *party; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) return FALSE; side = GetBattlerSide(battler); @@ -4328,7 +4326,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); gSpecialStatuses[battler].switchInAbilityDone = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { if (!gAbilitiesInfo[gBattleMons[target1].ability].cantBeTraced && gBattleMons[target1].hp != 0 && !gAbilitiesInfo[gBattleMons[target2].ability].cantBeTraced && gBattleMons[target2].hp != 0) @@ -5177,7 +5175,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) && !(IS_MOVE_STATUS(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || !(moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + if (!IsDoubleBattle() || !(moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected gBattleScripting.battler = gBattlerAbility = gBattlerTarget; battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; @@ -8252,7 +8250,7 @@ u32 SetRandomTarget(u32 battler) [B_SIDE_OPPONENT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT}, }; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { target = GetBattlerAtPosition(targets[GetBattlerSide(battler)][Random() % 2]); if (!IsBattlerAlive(target)) @@ -8317,7 +8315,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) targetBattler = gSideTimers[side].followmeTarget; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM) + else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) targetBattler = SetRandomTarget(gBattlerAttacker); else targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); @@ -9983,7 +9981,7 @@ static inline uq4_12_t GetScreensModifier(u32 move, u32 battlerAtk, u32 battlerD if (isCrit || abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[battlerAtk].confusionSelfDmg) return UQ_4_12(1.0); if (reflect || lightScreen || auroraVeil) - return (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) ? UQ_4_12(0.667) : UQ_4_12(0.5); + return (IsDoubleBattle()) ? UQ_4_12(0.667) : UQ_4_12(0.5); return UQ_4_12(1.0); } @@ -11787,7 +11785,7 @@ void SetShellSideArmCategory(void) bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) { - return (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + return (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerDef)) && battlerDef != BATTLE_PARTNER(battlerAtk)); } diff --git a/src/battle_util2.c b/src/battle_util2.c index 2c333978d2..326acf0e40 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -80,7 +80,7 @@ void AdjustFriendshipOnBattleFaint(u8 battler) { u8 opposingBattlerId; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (IsDoubleBattle()) { u8 opposingBattlerId2; diff --git a/src/data/types_info.h b/src/data/types_info.h index f9bd233ca6..df74199bdd 100644 --- a/src/data/types_info.h +++ b/src/data/types_info.h @@ -60,6 +60,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB_WHITE, .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_NormalTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = TRUE, }, [TYPE_NORMAL] = { @@ -71,6 +73,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB_WHITE, // custom .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_NormalTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_SILK_SCARF, //.berry = ITEM_CHILAN_BERRY, //.gem = ITEM_NORMAL_GEM, @@ -88,6 +92,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(26, 8, 14), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_FightingTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_BLACK_BELT, //.berry = ITEM_CHOPLE_BERRY, //.gem = ITEM_FIGHTING_GEM, @@ -107,6 +113,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(31, 26, 7), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_FlyingTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_SHARP_BEAK, //.berry = ITEM_COBA_BERRY, //.gem = ITEM_FLYING_GEM, @@ -126,6 +134,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(26, 10, 25), // custom .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_PoisonTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_POISON_BARB, //.berry = ITEM_KEBIA_BERRY, //.gem = ITEM_POISON_GEM, @@ -145,6 +155,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(25, 23, 18), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_GroundTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_SOFT_SAND, //.berry = ITEM_SHUCA_BERRY, //.gem = ITEM_GROUND_GEM, @@ -164,6 +176,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(18, 16, 8), // custom .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_RockTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_HARD_STONE, //.berry = ITEM_CHARTI_BERRY, //.gem = ITEM_ROCK_GEM, @@ -183,6 +197,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(18, 24, 6), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_BugTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_SILVER_POWDER, //.berry = ITEM_TANGA_BERRY, //.gem = ITEM_BUG_GEM, @@ -202,6 +218,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(12, 10, 16), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_GhostTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_SPELL_TAG, //.berry = ITEM_KASIB_BERRY, //.gem = ITEM_GHOST_GEM, @@ -221,6 +239,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(19, 19, 20), .damageCategory = DAMAGE_CATEGORY_PHYSICAL, .paletteTMHM = gItemIconPalette_SteelTMHM, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_METAL_COAT, //.berry = ITEM_BABIRI_BERRY, //.gem = ITEM_STEEL_GEM, @@ -237,6 +257,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .palette = 15, .teraTypeRGBValue = RGB_WHITE, .damageCategory = DAMAGE_CATEGORY_SPECIAL, + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = TRUE, }, [TYPE_FIRE] = { @@ -248,6 +270,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(31, 20, 11), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_FireTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_CHARCOAL, //.berry = ITEM_OCCA_BERRY, //.gem = ITEM_FIRE_GEM, @@ -267,6 +291,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(10, 18, 27), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_WaterTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_MYSTIC_WATER, //.berry = ITEM_PASSHO_BERRY, //.gem = ITEM_WATER_GEM, @@ -286,6 +312,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(12, 24, 11), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_GrassTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_MIRACLE_SEED, //.berry = ITEM_RINDO_BERRY, //.gem = ITEM_GRASS_GEM, @@ -305,6 +333,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(30, 26, 7), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_ElectricTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_MAGNET, //.berry = ITEM_WACAN_BERRY, //.gem = ITEM_ELECTRIC_GEM, @@ -324,6 +354,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(31, 14, 15), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_PsychicTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_TWISTED_SPOON, //.berry = ITEM_PAYAPA_BERRY, //.gem = ITEM_PSYCHIC_GEM, @@ -343,6 +375,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(14, 26, 25), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_IceTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_NEVER_MELT_ICE, //.berry = ITEM_YACHE_BERRY, //.gem = ITEM_ICE_GEM, @@ -362,6 +396,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(10, 18, 27), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_DragonTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_DRAGON_FANG, //.berry = ITEM_HABAN_BERRY, //.gem = ITEM_DRAGON_GEM, @@ -381,6 +417,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(6, 5, 8), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_DarkTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_BLACK_GLASSES, //.berry = ITEM_COLBUR_BERRY, //.gem = ITEM_DARK_GEM, @@ -400,6 +438,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .teraTypeRGBValue = RGB(31, 15, 21), .damageCategory = DAMAGE_CATEGORY_SPECIAL, .paletteTMHM = gItemIconPalette_FairyTMHM, + .useSecondTypeIconPalette = TRUE, + .isSpecialCaseType = FALSE, //.enhanceItem = ITEM_FAIRY_FEATHER, //.berry = ITEM_ROSELI_BERRY, //.gem = ITEM_FAIRY_GEM, @@ -418,6 +458,8 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .maxMove = MOVE_MAX_STRIKE, .teraTypeRGBValue = RGB(10, 18, 27), .paletteTMHM = gItemIconPalette_NormalTMHM, // failsafe + .useSecondTypeIconPalette = FALSE, + .isSpecialCaseType = TRUE, // .teraShard = ITEM_STELLAR_TERA_SHARD, }, }; diff --git a/src/graphics.c b/src/graphics.c index c35cec3467..9fb0771575 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -2048,3 +2048,9 @@ const u16 gFrontierPassCancelButtonHighlighted_Tilemap[] = INCBIN_U16("graphics/ const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz"); + +const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.lz"); +const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.lz"); +const u32 gBattleIcons_Pal1[] = INCBIN_U32("graphics/types/battle_icons1.gbapal.lz"); +const u32 gBattleIcons_Pal2[] = INCBIN_U32("graphics/types/battle_icons2.gbapal.lz"); + diff --git a/src/party_menu.c b/src/party_menu.c index 5214ddc2be..15433854a5 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1353,7 +1353,7 @@ static void DrawCancelConfirmButtons(void) bool8 IsMultiBattle(void) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gMain.inBattle) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && IsDoubleBattle() && gMain.inBattle) return TRUE; else return FALSE; diff --git a/src/pokemon.c b/src/pokemon.c index 78e19dfc8b..cfb2307126 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2100,7 +2100,7 @@ u8 GetDefaultMoveTarget(u8 battlerId) { u8 opposing = BATTLE_OPPOSITE(GetBattlerSide(battlerId)); - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (!IsDoubleBattle()) return GetBattlerAtPosition(opposing); if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battlerId) > 1) { diff --git a/src/tv.c b/src/tv.c index e0f910eaaf..c0e207ce8a 100644 --- a/src/tv.c +++ b/src/tv.c @@ -1262,7 +1262,7 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye if (gBattleTypeFlags & BATTLE_TYPE_MULTI) show->battleUpdate.battleType = 2; - else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + else if (IsDoubleBattle()) show->battleUpdate.battleType = 1; else show->battleUpdate.battleType = 0; diff --git a/src/type_icons.c b/src/type_icons.c new file mode 100644 index 0000000000..a36c347775 --- /dev/null +++ b/src/type_icons.c @@ -0,0 +1,516 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_gimmick.h" +#include "decompress.h" +#include "graphics.h" +#include "pokedex.h" +#include "sprite.h" +#include "type_icons.h" + +static void LoadTypeSpritesAndPalettes(void); +static void LoadTypeIconsPerBattler(u32, u32); + +static bool32 UseDoubleBattleCoords(u32); + +static u32 GetMonPublicType(u32, u32); +static bool32 ShouldHideUncaughtType(u32); +static u32 GetMonDefensiveTeraType(struct Pokemon *, struct Pokemon*, u32, u32, u32, u32); +static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon*, u32, u32); + +static void CreateSpriteFromType(u32, bool32, u32[], u32, u32); +static bool32 ShouldSkipSecondType(u32[], u32); +static void SetTypeIconXY(s32*, s32*, u32, bool32, u32); + +static void CreateSpriteAndSetTypeSpriteAttributes(u32, u32 x, u32 y, u32, u32, bool32); +static bool32 ShouldFlipTypeIcon(bool32, u32, u32); + +static void SpriteCB_TypeIcon(struct Sprite*); +static void DestroyTypeIcon(struct Sprite*); +static bool32 ShouldHideTypeIcon(u32); +static s32 GetTypeIconHideMovement(bool32, u32); +static s32 GetTypeIconSlideMovement(bool32, u32, s32); +static s32 GetTypeIconBounceMovement(s32, u32); + +const struct Coords16 sTypeIconPositions[][2] = +{ + [B_POSITION_PLAYER_LEFT] = + { + [FALSE] = {221, 86}, + [TRUE] = {144, 71}, + }, + [B_POSITION_OPPONENT_LEFT] = + { + [FALSE] = {20, 26}, + [TRUE] = {97, 14}, + }, + [B_POSITION_PLAYER_RIGHT] = + { + [TRUE] = {156, 96}, + }, + [B_POSITION_OPPONENT_RIGHT] = + { + [TRUE] = {85, 39}, + }, +}; + +const union AnimCmd sSpriteAnim_TypeIcon_Normal[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_NORMAL), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Fighting[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_FIGHTING), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Flying[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_FLYING), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Poison[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_POISON), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Ground[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_GROUND), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Rock[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_ROCK), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Bug[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_BUG), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Ghost[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_GHOST), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Steel[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_STEEL), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Mystery[] = +{ + ANIMCMD_FRAME(TYPE_ICON_1_FRAME(TYPE_MYSTERY), 0), + ANIMCMD_END +}; + +const union AnimCmd sSpriteAnim_TypeIcon_Fire[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_FIRE), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Water[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_WATER), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Grass[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_GRASS), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Electric[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_ELECTRIC), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Psychic[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_PSYCHIC), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Ice[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_ICE), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Dragon[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_DRAGON), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Dark[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_DARK), 0), + ANIMCMD_END +}; +const union AnimCmd sSpriteAnim_TypeIcon_Fairy[] = +{ + ANIMCMD_FRAME(TYPE_ICON_2_FRAME(TYPE_FAIRY), 0), + ANIMCMD_END +}; + +const union AnimCmd *const sSpriteAnimTable_TypeIcons[] = +{ + [TYPE_NONE] = sSpriteAnim_TypeIcon_Mystery, + [TYPE_NORMAL] = sSpriteAnim_TypeIcon_Normal, + [TYPE_FIGHTING] = sSpriteAnim_TypeIcon_Fighting, + [TYPE_FLYING] = sSpriteAnim_TypeIcon_Flying, + [TYPE_POISON] = sSpriteAnim_TypeIcon_Poison, + [TYPE_GROUND] = sSpriteAnim_TypeIcon_Ground, + [TYPE_ROCK] = sSpriteAnim_TypeIcon_Rock, + [TYPE_BUG] = sSpriteAnim_TypeIcon_Bug, + [TYPE_GHOST] = sSpriteAnim_TypeIcon_Ghost, + [TYPE_STEEL] = sSpriteAnim_TypeIcon_Steel, + [TYPE_MYSTERY] = sSpriteAnim_TypeIcon_Mystery, + [TYPE_FIRE] = sSpriteAnim_TypeIcon_Fire, + [TYPE_WATER] = sSpriteAnim_TypeIcon_Water, + [TYPE_GRASS] = sSpriteAnim_TypeIcon_Grass, + [TYPE_ELECTRIC] = sSpriteAnim_TypeIcon_Electric, + [TYPE_PSYCHIC] = sSpriteAnim_TypeIcon_Psychic, + [TYPE_ICE] = sSpriteAnim_TypeIcon_Ice, + [TYPE_DRAGON] = sSpriteAnim_TypeIcon_Dragon, + [TYPE_DARK] = sSpriteAnim_TypeIcon_Dark, + [TYPE_FAIRY] = sSpriteAnim_TypeIcon_Fairy, + [TYPE_STELLAR] = sSpriteAnim_TypeIcon_Mystery, +}; + +const struct CompressedSpritePalette sTypeIconPal1 = +{ + .data = gBattleIcons_Pal1, + .tag = TYPE_ICON_TAG +}; + +const struct CompressedSpritePalette sTypeIconPal2 = +{ + .data = gBattleIcons_Pal2, + .tag = TYPE_ICON_TAG_2 +}; + +const struct OamData sOamData_TypeIcons = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(8x16), + .size = SPRITE_SIZE(8x16), + .priority = 1, +}; + +const struct CompressedSpriteSheet sSpriteSheet_TypeIcons2 = +{ + .data = gBattleIcons_Gfx2, + .size = (8*16) * 9, + .tag = TYPE_ICON_TAG_2, +}; + +const struct CompressedSpriteSheet sSpriteSheet_TypeIcons1 = +{ + .data = gBattleIcons_Gfx1, + .size = (8*16) * 10, + .tag = TYPE_ICON_TAG, +}; + +const struct SpriteTemplate sSpriteTemplate_TypeIcons1 = +{ + .tileTag = TYPE_ICON_TAG, + .paletteTag = TYPE_ICON_TAG, + .oam = &sOamData_TypeIcons, + .anims = sSpriteAnimTable_TypeIcons, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_TypeIcon +}; + +const struct SpriteTemplate sSpriteTemplate_TypeIcons2 = +{ + .tileTag = TYPE_ICON_TAG_2, + .paletteTag = TYPE_ICON_TAG_2, + .oam = &sOamData_TypeIcons, + .anims = sSpriteAnimTable_TypeIcons, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_TypeIcon +}; + +void LoadTypeIcons(u32 battler) +{ + u32 position; + + if (B_SHOW_TYPES == SHOW_TYPES_NEVER) + return; + + LoadTypeSpritesAndPalettes(); + + for (position = 0; position < gBattlersCount; ++position) + LoadTypeIconsPerBattler(battler, position); +} + +static void LoadTypeSpritesAndPalettes(void) +{ + if (IndexOfSpritePaletteTag(TYPE_ICON_TAG) != UCHAR_MAX) + return; + + LoadCompressedSpriteSheet(&sSpriteSheet_TypeIcons1); + LoadCompressedSpriteSheet(&sSpriteSheet_TypeIcons2); + LoadCompressedSpritePalette(&sTypeIconPal1); + LoadCompressedSpritePalette(&sTypeIconPal2); +} + +static void LoadTypeIconsPerBattler(u32 battler, u32 position) +{ + u32 typeNum, types[2]; + u32 battlerId = GetBattlerAtPosition(position); + bool32 useDoubleBattleCoords = UseDoubleBattleCoords(battlerId); + + if (!IsBattlerAlive(battlerId)) + return; + + for (typeNum = 0; typeNum < 2; ++typeNum) + types[typeNum] = GetMonPublicType(battlerId, typeNum); + + for (typeNum = 0; typeNum < 2; ++typeNum) + CreateSpriteFromType(position, useDoubleBattleCoords, types, typeNum, battler); +} + +static bool32 UseDoubleBattleCoords(u32 position) +{ + if (!IsDoubleBattle()) + return FALSE; + + if ((position == B_POSITION_PLAYER_LEFT) && (gBattleMons[B_POSITION_PLAYER_RIGHT].species == SPECIES_NONE)) + return FALSE; + + if ((position == B_POSITION_OPPONENT_LEFT) && (gBattleMons[B_POSITION_OPPONENT_RIGHT].species == SPECIES_NONE)) + return FALSE; + + return TRUE; +} + +static u32 GetMonPublicType(u32 battlerId, u32 typeNum) +{ + struct Pokemon* mon = GetBattlerData(battlerId); + u32 monSpecies = GetMonData(mon,MON_DATA_SPECIES,NULL); + struct Pokemon* monIllusion; + u32 illusionSpecies; + + if (ShouldHideUncaughtType(monSpecies)) + return TYPE_MYSTERY; + + monIllusion = GetIllusionMonPtr(battlerId); + illusionSpecies = GetMonData(monIllusion,MON_DATA_SPECIES,NULL); + + if (GetActiveGimmick(battlerId) == GIMMICK_TERA) + return GetMonDefensiveTeraType(mon,monIllusion,battlerId,typeNum,illusionSpecies,monSpecies); + + if (IsIllusionActiveAndTypeUnchanged(monIllusion,monSpecies, battlerId)) + return gSpeciesInfo[illusionSpecies].types[typeNum]; + + return gBattleMons[battlerId].types[typeNum]; +} + +static bool32 ShouldHideUncaughtType(u32 species) +{ + if (B_SHOW_TYPES != SHOW_TYPES_CAUGHT) + return FALSE; + + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species),FLAG_GET_CAUGHT)) + return FALSE; + + return TRUE; +} + +static u32 GetMonDefensiveTeraType(struct Pokemon * mon, struct Pokemon* monIllusion, u32 battlerId, u32 typeNum, u32 illusionSpecies, u32 monSpecies) +{ + u32 teraType = GetBattlerTeraType(battlerId); + u32 targetSpecies; + + if (teraType != TYPE_STELLAR) + return teraType; + + targetSpecies = (monIllusion != NULL) ? illusionSpecies : monSpecies; + + return gSpeciesInfo[targetSpecies].types[typeNum]; +} + +static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 monSpecies, u32 battlerId) +{ + u32 typeNum; + + if (monIllusion == NULL) + return FALSE; + + for (typeNum = 0; typeNum < 2; typeNum++) + if (gSpeciesInfo[monSpecies].types[typeNum] != gBattleMons[battlerId].types[typeNum]) + return FALSE; + + return TRUE; +} + +static void CreateSpriteFromType(u32 position, bool32 useDoubleBattleCoords, u32 types[], u32 typeNum, u32 battler) +{ + s32 x = 0, y = 0; + + if (ShouldSkipSecondType(types, typeNum)) + return; + + SetTypeIconXY(&x, &y, position, useDoubleBattleCoords, typeNum); + + CreateSpriteAndSetTypeSpriteAttributes(types[typeNum], x, y, position, battler, useDoubleBattleCoords); +} + +static bool32 ShouldSkipSecondType(u32 types[], u32 typeNum) +{ + if (!typeNum) + return FALSE; + + if (types[0] != types[1]) + return FALSE; + + return TRUE; +} + +static void SetTypeIconXY(s32* x, s32* y, u32 position, bool32 useDoubleBattleCoords, u32 typeNum) +{ + *x = sTypeIconPositions[position][useDoubleBattleCoords].x; + *y = sTypeIconPositions[position][useDoubleBattleCoords].y + (11 * typeNum); +} + +static void CreateSpriteAndSetTypeSpriteAttributes(u32 type, u32 x, u32 y, u32 position, u32 battler, bool32 useDoubleBattleCoords) +{ + struct Sprite* sprite; + const struct SpriteTemplate* spriteTemplate = gTypesInfo[type].useSecondTypeIconPalette ? &sSpriteTemplate_TypeIcons2 : &sSpriteTemplate_TypeIcons1; + u32 spriteId = CreateSpriteAtEnd(spriteTemplate, x, y, UCHAR_MAX); + + if (spriteId == MAX_SPRITES) + return; + + sprite = &gSprites[spriteId]; + sprite->tMonPosition = position; + sprite->tBattlerId = battler; + sprite->tVerticalPosition = y; + + sprite->hFlip = ShouldFlipTypeIcon(useDoubleBattleCoords, position, type); + + StartSpriteAnim(sprite, type); +} + +static bool32 ShouldFlipTypeIcon(bool32 useDoubleBattleCoords, u32 position, u32 typeId) +{ + bool32 side = (useDoubleBattleCoords) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; + + if (GetBattlerSide(GetBattlerAtPosition(position)) != side) + return FALSE; + + return !gTypesInfo[typeId].isSpecialCaseType; +} + +static void SpriteCB_TypeIcon(struct Sprite* sprite) +{ + u32 position = sprite->tMonPosition; + u32 battlerId = sprite->tBattlerId; + bool32 useDoubleBattleCoords = UseDoubleBattleCoords(GetBattlerAtPosition(position)); + + if (sprite->tHideIconTimer == NUM_FRAMES_HIDE_TYPE_ICON) + { + DestroyTypeIcon(sprite); + return; + } + + if (ShouldHideTypeIcon(battlerId)) + { + sprite->x += GetTypeIconHideMovement(useDoubleBattleCoords, position); + ++sprite->tHideIconTimer; + return; + } + + sprite->x += GetTypeIconSlideMovement(useDoubleBattleCoords,position, sprite->x); + sprite->y = GetTypeIconBounceMovement(sprite->tVerticalPosition,position); +} + +static void DestroyTypeIcon(struct Sprite* sprite) +{ + u32 i; + DestroySpriteAndFreeResources(sprite); + + for (i = 0; i < MAX_SPRITES; ++i) + { + if (!gSprites[i].inUse) + continue; + + if (gSprites[i].template->paletteTag == TYPE_ICON_TAG) + return; + } + + FreeSpritePaletteByTag(TYPE_ICON_TAG); + FreeSpritePaletteByTag(TYPE_ICON_TAG_2); +} + +static bool32 ShouldHideTypeIcon(u32 battlerId) +{ + return gBattlerControllerFuncs[battlerId] != PlayerHandleChooseMove + && gBattlerControllerFuncs[battlerId] != HandleInputChooseMove + && gBattlerControllerFuncs[battlerId] != HandleChooseMoveAfterDma3 + && gBattlerControllerFuncs[battlerId] != HandleInputChooseMove + && gBattlerControllerFuncs[battlerId] != HandleInputChooseTarget + && gBattlerControllerFuncs[battlerId] != HandleMoveSwitching + && gBattlerControllerFuncs[battlerId] != HandleInputChooseMove; +} + +static s32 GetTypeIconHideMovement(bool32 useDoubleBattleCoords, u32 position) +{ + if (useDoubleBattleCoords) + { + if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_PLAYER_RIGHT) + return 1; + else + return -1; + } + + if (position == B_POSITION_PLAYER_LEFT) + return -1; + else + return 1; +} + +static s32 GetTypeIconSlideMovement(bool32 useDoubleBattleCoords, u32 position, s32 xPos) +{ + if (useDoubleBattleCoords) + { + switch (position) + { + case B_POSITION_PLAYER_LEFT: + case B_POSITION_PLAYER_RIGHT: + if (xPos > sTypeIconPositions[position][useDoubleBattleCoords].x - 10) + return -1; + break; + default: + case B_POSITION_OPPONENT_LEFT: + case B_POSITION_OPPONENT_RIGHT: + if (xPos < sTypeIconPositions[position][useDoubleBattleCoords].x + 10) + return 1; + break; + } + return 0; + } + + if (position == B_POSITION_PLAYER_LEFT) + { + if (xPos < sTypeIconPositions[position][useDoubleBattleCoords].x + 10) + return 1; + } + else + { + if (xPos > sTypeIconPositions[position][useDoubleBattleCoords].x - 10) + return -1; + } + return 0; +} + +static s32 GetTypeIconBounceMovement(s32 originalY, u32 position) +{ + struct Sprite* healthbox = &gSprites[gHealthboxSpriteIds[GetBattlerAtPosition(position)]]; + return originalY + healthbox->y2; +} + From 779cedd16f7fe9a28b0d82cbe740ed6b171563e4 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 11 Aug 2024 17:13:46 +0100 Subject: [PATCH 071/225] Fixes Dancer, adds Revelation Dance interactions with Z-Move, Roost and typeless mons (#5133) * Add Revelation Dance interactions with typeless mons, Roost and Z-Move * Fixes Dancer-called moves not updating their type * Adds Revelation Dance tests * Make sure target isn't immune in Dancer test * Missing ... in message * Missing Assume * CI ends Dancer test too early? * Z-Revelation Dance is Breakneck Blitz (Test) * Fix test (Zoroark too strong?) * Replace H!Zoroark * Remove Ability specification * Remove HP_Bars * Fix Dancer checking for battlers that don't exist in single battles --- src/battle_main.c | 10 +- src/battle_script_commands.c | 6 +- src/battle_util.c | 6 +- test/battle/ability/dancer.c | 19 +++ test/battle/gimmick/zmove.c | 19 +++ test/battle/move_effect/revelation_dance.c | 149 +++++++++++++++++++++ 6 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 test/battle/move_effect/revelation_dance.c diff --git a/src/battle_main.c b/src/battle_main.c index 6bbcc0e3bc..526c54d62f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5824,16 +5824,20 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) { gBattleStruct->dynamicMoveType = ItemId_GetSecondaryId(gBattleMons[battlerAtk].item) | F_DYNAMIC_TYPE_SET; } - else if (gMovesInfo[move].effect == EFFECT_REVELATION_DANCE) + else if (gMovesInfo[move].effect == EFFECT_REVELATION_DANCE && GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE) { if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA && GetBattlerTeraType(battlerAtk) != TYPE_STELLAR) gBattleStruct->dynamicMoveType = GetBattlerTeraType(battlerAtk); - else if (gBattleMons[battlerAtk].types[0] != TYPE_MYSTERY) + else if (gBattleMons[battlerAtk].types[0] != TYPE_MYSTERY && !(gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_ROOST && gBattleMons[battlerAtk].types[0] == TYPE_FLYING)) gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[0] | F_DYNAMIC_TYPE_SET; - else if (gBattleMons[battlerAtk].types[1] != TYPE_MYSTERY) + else if (gBattleMons[battlerAtk].types[1] != TYPE_MYSTERY && !(gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_ROOST && gBattleMons[battlerAtk].types[1] == TYPE_FLYING)) gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[1] | F_DYNAMIC_TYPE_SET; + else if (gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_ROOST) + gBattleStruct->dynamicMoveType = (B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY) | F_DYNAMIC_TYPE_SET; else if (gBattleMons[battlerAtk].types[2] != TYPE_MYSTERY) gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].types[2] | F_DYNAMIC_TYPE_SET; + else + gBattleStruct->dynamicMoveType = TYPE_MYSTERY | F_DYNAMIC_TYPE_SET; } else if (gMovesInfo[move].effect == EFFECT_RAGING_BULL && (gBattleMons[battlerAtk].species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9d10c87cf7..317613c479 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6257,7 +6257,7 @@ static void Cmd_moveend(void) u32 battler, nextDancer = 0; bool32 turnOnHitmarker = FALSE; - for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + for (battler = 0; battler < gBattlersCount; battler++) { if (gSpecialStatuses[battler].dancerUsedMove) { @@ -6278,7 +6278,7 @@ static void Cmd_moveend(void) gBattleScripting.savedBattler |= (gBattlerAttacker << 4); gSpecialStatuses[gBattlerAttacker].dancerUsedMove = TRUE; } - for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + for (battler = 0; battler < gBattlersCount; battler++) { if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) { @@ -12898,7 +12898,7 @@ static void Cmd_settypetorandomresistance(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR) + else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR || gLastHitByType[gBattlerAttacker] == TYPE_MYSTERY) { gBattlescriptCurrInstr = cmd->failInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index 56701e2d99..e517a81605 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5565,6 +5565,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && TARGET_TURN_DAMAGED && !IS_BATTLER_OF_TYPE(battler, moveType) && moveType != TYPE_STELLAR + && moveType != TYPE_MYSTERY && IsBattlerAlive(battler)) { SET_BATTLER_TYPE(battler, moveType); @@ -6049,6 +6050,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Edge case for dance moves that hit multiply targets gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; + SetTypeBeforeUsingMove(gCalledMove, battler); // Make sure that the target isn't an ally - if it is, target the original user if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker)) @@ -9860,7 +9862,9 @@ static inline uq4_12_t GetParentalBondModifier(u32 battlerAtk) static inline uq4_12_t GetSameTypeAttackBonusModifier(u32 battlerAtk, u32 moveType, u32 move, u32 abilityAtk) { - if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), moveType)) + if (moveType == TYPE_MYSTERY) + return UQ_4_12(1.0); + else if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), moveType)) return (abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); else if (!IS_BATTLER_OF_TYPE(battlerAtk, moveType) || move == MOVE_STRUGGLE || move == MOVE_NONE) return UQ_4_12(1.0); diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index f54f7ab76a..660a719c69 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -126,3 +126,22 @@ DOUBLE_BATTLE_TEST("Dancer still triggers if another dancer flinches") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); } } + +SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].effect == EFFECT_REVELATION_DANCE); + PLAYER(SPECIES_TANGROWTH); + OPPONENT(SPECIES_ORICORIO_BAILE); + } WHEN { + TURN { MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + MESSAGE("It's not very effective…"); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, opponent); + NOT MESSAGE("It's not very effective…"); + MESSAGE("It's super effective!"); + } +} diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index bde241bfd7..1eb2c7ae74 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -599,3 +599,22 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Searing Sunraze Smash ignores the target's abilitie MESSAGE("A critical hit!"); } } + +SINGLE_BATTLE_TEST("(Z-MOVE) Z-Revelation Dance always transforms into Breakneck Blitz") +{ + u16 species; + PARAMETRIZE { species = SPECIES_ORICORIO_BAILE; } + PARAMETRIZE { species = SPECIES_ORICORIO_PAU; } + PARAMETRIZE { species = SPECIES_ORICORIO_POM_POM; } + PARAMETRIZE { species = SPECIES_ORICORIO_SENSU; } + GIVEN { + ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].type == TYPE_NORMAL); + PLAYER(species) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REVELATION_DANCE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, player); + } +} diff --git a/test/battle/move_effect/revelation_dance.c b/test/battle/move_effect/revelation_dance.c new file mode 100644 index 0000000000..489dee1c87 --- /dev/null +++ b/test/battle/move_effect/revelation_dance.c @@ -0,0 +1,149 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].effect == EFFECT_REVELATION_DANCE); + ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].danceMove == TRUE); + ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE)); + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].effect == EFFECT_THIRD_TYPE); + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].argument == TYPE_GRASS); + ASSUME(gMovesInfo[MOVE_ROOST].effect == EFFECT_ROOST); +} + +SINGLE_BATTLE_TEST("Revelation Dance changes its type depending on the user's 1st Type") +{ + u16 speciesPlayer; + u16 speciesOpponent; + + PARAMETRIZE { speciesPlayer = SPECIES_ORICORIO_POM_POM; speciesOpponent = SPECIES_DUGTRIO; } + PARAMETRIZE { speciesPlayer = SPECIES_ORICORIO_BAILE; speciesOpponent = SPECIES_BLASTOISE; } + PARAMETRIZE { speciesPlayer = SPECIES_ORICORIO_PAU; speciesOpponent = SPECIES_LIEPARD; } + PARAMETRIZE { speciesPlayer = SPECIES_ORICORIO_SENSU; speciesOpponent = SPECIES_PERSIAN; } + + GIVEN { + PLAYER(speciesPlayer); + OPPONENT(speciesOpponent); + } WHEN { + TURN { MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + if (speciesPlayer == SPECIES_ORICORIO_BAILE) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } + else { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } + } + } +} + +SINGLE_BATTLE_TEST("Revelation Dance changes its type depending on the user's 2nd Type if it has no 1st type") +{ + GIVEN { + PLAYER(SPECIES_ORICORIO_BAILE); + OPPONENT(SPECIES_EMPOLEON); + } WHEN { + TURN { MOVE(player, MOVE_BURN_UP); } + TURN { MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + HP_BAR(opponent); + NONE_OF { + MESSAGE("It's not very effective…"); + MESSAGE("It's super effective!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } +} + +SINGLE_BATTLE_TEST("Revelation Dance changes its type depending on the user's 3rd Type if it has no 1st or 2nd type") +{ + GIVEN { + PLAYER(SPECIES_GROWLITHE); + OPPONENT(SPECIES_TREVENANT); + } WHEN { + TURN { MOVE(player, MOVE_BURN_UP); MOVE(opponent, MOVE_FORESTS_CURSE); } + TURN { MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + HP_BAR(opponent); + MESSAGE("It's super effective!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FORESTS_CURSE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } +} + +SINGLE_BATTLE_TEST("Revelation Dance becomes Typeless if its user is Typeless") +{ + u16 speciesOpponent; + + PARAMETRIZE { speciesOpponent = SPECIES_BLISSEY; } + PARAMETRIZE { speciesOpponent = SPECIES_BLASTOISE; } + PARAMETRIZE { speciesOpponent = SPECIES_CHARIZARD; } + PARAMETRIZE { speciesOpponent = SPECIES_VENUSAUR; } + PARAMETRIZE { speciesOpponent = SPECIES_GOLEM; } + PARAMETRIZE { speciesOpponent = SPECIES_AEGISLASH; } + + GIVEN { + PLAYER(SPECIES_GROWLITHE); + OPPONENT(speciesOpponent); + } WHEN { + TURN { MOVE(player, MOVE_BURN_UP); } + TURN { MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + NONE_OF { + MESSAGE("It's not very effective…"); + MESSAGE("It's super effective!"); + } + } +} + +SINGLE_BATTLE_TEST("Revelation Dance becomes Normal type if used by a Typeless Pokemon due to Roost") +{ + u16 speciesOpponent; + + PARAMETRIZE { speciesOpponent = SPECIES_SABLEYE; } + PARAMETRIZE { speciesOpponent = SPECIES_AGGRON; } + + ASSUME(B_ROOST_PURE_FLYING >= GEN_5); + + GIVEN { + PLAYER(SPECIES_ORICORIO_BAILE) { Ability(ABILITY_DANCER); } + OPPONENT(speciesOpponent); + } WHEN { + TURN { MOVE(player, MOVE_BURN_UP); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_ROOST); MOVE(opponent, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROOST, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_DANCER); + if (speciesOpponent == SPECIES_AGGRON) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } + else { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + HP_BAR(opponent); + MESSAGE("It's not very effective…"); + } + } + } +} From 805bb2888cf5400ec1b031c5766f0115e9ace35d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:27:22 +0200 Subject: [PATCH 072/225] Fixes wrong padding in struct SpeciesInfo (#5139) Fixes wrong padding in struct SpeciesInfo that is if I counted correctly. After I opened #5138 I realized it might be an issue on master as well. --- include/pokemon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/pokemon.h b/include/pokemon.h index d1484fe2ce..22c465214c 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -441,7 +441,7 @@ struct SpeciesInfo /*0xC4*/ u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set. u32 tmIlliterate:1; // This species will be unable to learn the universal moves. u32 isFrontierBanned:1; // This species is not allowed to participate in Battle Frontier facilities. - u32 padding4:14; + u32 padding4:13; // Move Data /* 0x80 */ const struct LevelUpMove *levelUpLearnset; /* 0x84 */ const u16 *teachableLearnset; From 25f7f431faae05621ea9d57be5150a98f6d01b55 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Sun, 11 Aug 2024 21:06:33 +0100 Subject: [PATCH 073/225] Remove agbcc (#4994) --- .github/workflows/build.yml | 23 +- INSTALL.md | 52 - Makefile | 109 +- common_syms/AgbRfu_LinkManager.txt | 1 - common_syms/agb_flash.txt | 10 - common_syms/apprentice.txt | 3 - common_syms/battle_anim_throw.txt | 3 - common_syms/battle_controllers.txt | 3 - common_syms/battle_factory_screen.txt | 1 - common_syms/battle_main.txt | 7 - common_syms/battle_tower.txt | 1 - common_syms/berry_blender.txt | 1 - common_syms/bg.txt | 1 - common_syms/contest.txt | 1 - common_syms/contest_painting.txt | 4 - common_syms/ereader_screen.txt | 1 - common_syms/evolution_scene.txt | 1 - common_syms/faraway_island.txt | 3 - common_syms/field_camera.txt | 3 - common_syms/field_control_avatar.txt | 1 - common_syms/field_specials.txt | 1 - common_syms/fieldmap.txt | 1 - common_syms/image_processing_effects.txt | 10 - common_syms/intro.txt | 2 - common_syms/librfu_rfu.txt | 5 - common_syms/librfu_sio32id.txt | 1 - common_syms/librfu_stwi.txt | 1 - common_syms/link.txt | 35 - common_syms/link_rfu_2.txt | 2 - common_syms/list_menu.txt | 2 - common_syms/load_save.txt | 4 - common_syms/m4a.txt | 12 - common_syms/main.txt | 10 - common_syms/mauville_old_man.txt | 1 - common_syms/overworld.txt | 8 - common_syms/party_menu.txt | 1 - common_syms/pokedex.txt | 2 - common_syms/pokedex_cry_screen.txt | 1 - common_syms/random.txt | 2 - common_syms/rtc.txt | 1 - common_syms/save.txt | 13 - common_syms/sound.txt | 1 - common_syms/sprite.txt | 2 - common_syms/start_menu.txt | 1 - common_syms/task.txt | 1 - common_syms/text.txt | 4 - common_syms/trainer_see.txt | 5 - common_syms/tv.txt | 4 - common_syms/window.txt | 2 - ld_script.ld | 1391 ---------------------- sym_bss.txt | 63 - sym_common.txt | 83 -- sym_ewram.txt | 154 --- 53 files changed, 18 insertions(+), 2037 deletions(-) delete mode 100644 common_syms/AgbRfu_LinkManager.txt delete mode 100644 common_syms/agb_flash.txt delete mode 100644 common_syms/apprentice.txt delete mode 100755 common_syms/battle_anim_throw.txt delete mode 100644 common_syms/battle_controllers.txt delete mode 100644 common_syms/battle_factory_screen.txt delete mode 100644 common_syms/battle_main.txt delete mode 100644 common_syms/battle_tower.txt delete mode 100644 common_syms/berry_blender.txt delete mode 100644 common_syms/bg.txt delete mode 100644 common_syms/contest.txt delete mode 100644 common_syms/contest_painting.txt delete mode 100644 common_syms/ereader_screen.txt delete mode 100644 common_syms/evolution_scene.txt delete mode 100755 common_syms/faraway_island.txt delete mode 100644 common_syms/field_camera.txt delete mode 100644 common_syms/field_control_avatar.txt delete mode 100644 common_syms/field_specials.txt delete mode 100644 common_syms/fieldmap.txt delete mode 100644 common_syms/image_processing_effects.txt delete mode 100644 common_syms/intro.txt delete mode 100644 common_syms/librfu_rfu.txt delete mode 100644 common_syms/librfu_sio32id.txt delete mode 100644 common_syms/librfu_stwi.txt delete mode 100644 common_syms/link.txt delete mode 100644 common_syms/link_rfu_2.txt delete mode 100644 common_syms/list_menu.txt delete mode 100644 common_syms/load_save.txt delete mode 100644 common_syms/m4a.txt delete mode 100644 common_syms/main.txt delete mode 100644 common_syms/mauville_old_man.txt delete mode 100644 common_syms/overworld.txt delete mode 100644 common_syms/party_menu.txt delete mode 100644 common_syms/pokedex.txt delete mode 100644 common_syms/pokedex_cry_screen.txt delete mode 100644 common_syms/random.txt delete mode 100644 common_syms/rtc.txt delete mode 100644 common_syms/save.txt delete mode 100644 common_syms/sound.txt delete mode 100644 common_syms/sprite.txt delete mode 100644 common_syms/start_menu.txt delete mode 100644 common_syms/task.txt delete mode 100644 common_syms/text.txt delete mode 100644 common_syms/trainer_see.txt delete mode 100644 common_syms/tv.txt delete mode 100644 common_syms/window.txt delete mode 100644 ld_script.ld delete mode 100644 sym_bss.txt delete mode 100644 sym_common.txt delete mode 100644 sym_ewram.txt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0322cbe11f..c84110d7dd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,19 +15,12 @@ jobs: GAME_VERSION: EMERALD GAME_REVISION: 0 GAME_LANGUAGE: ENGLISH - MODERN: 0 COMPARE: 0 UNUSED_ERROR: 1 steps: - name: Checkout uses: actions/checkout@v2 - - name: Checkout agbcc - uses: actions/checkout@v2 - with: - path: agbcc - repository: pret/agbcc - - name: Install binutils run: | sudo apt update @@ -36,27 +29,13 @@ jobs: # gcc-arm-none-eabi is only needed for the modern build # as an alternative to dkP - - name: Install agbcc - run: | - ./build.sh - ./install.sh ../ - working-directory: agbcc - - - name: Agbcc + - name: ROM env: - MODERN: 0 - COMPARE: 0 - run: make -j${nproc} -O all - - - name: Modern - env: - MODERN: 1 COMPARE: 0 run: make -j${nproc} -O all - name: Test env: - MODERN: 1 TEST: 1 run: | make -j${nproc} -O pokeemerald-test.elf diff --git a/INSTALL.md b/INSTALL.md index 6349d24fbb..49f11fce7c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -596,58 +596,6 @@ To build **pokeemerald.elf** with debug symbols under a modern toolchain: ```bash make DINFO=1 ``` -Note that this is not necessary for a non-modern (agbcc) build since those are built with debug symbols by default. - -### agbcc - -

- Deprecated; installing agbcc is optional since 1.7.0. - -1. Install agbcc into pokeemerald-expansion. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**: -- If agbcc has **not been built before** in the folder where you chose to store pokeemerald Expansion, run the following commands to build and install it into pokeemerald-expansion: - - ```bash - git clone https://github.com/pret/agbcc - cd agbcc - ./build.sh - ./install.sh ../pokeemerald-expansion - ``` - -- **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into pokeemerald-expansion: - - ```bash - cd agbcc - git clean -fX - ./build.sh - ./install.sh ../pokeemerald-expansion - ``` - -- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokeemerald-expansion: - - ```bash - cd agbcc - ./install.sh ../pokeemerald-expansion - ``` - -
- Note... - - > If building agbcc or pokeemerald results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before. -
- -2. Once agbcc is installed, change directory back to the base directory where pokeemerald-expansion and agbcc are stored: - - ```bash - cd .. - ``` - -3. To compile with agbcc: - - ```bash - make agbcc - ``` - -
# Useful additional tools diff --git a/Makefile b/Makefile index 6dacf8b1d3..6f8951d378 100644 --- a/Makefile +++ b/Makefile @@ -25,10 +25,8 @@ AS := $(PREFIX)as LD := $(PREFIX)ld -# note: the makefile must be set up so MODERNCC is never called -# if MODERN=0 -MODERNCC := $(PREFIX)gcc -PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC) +ARMCC := $(PREFIX)gcc +PATH_ARMCC := PATH="$(PATH)" $(ARMCC) ifeq ($(OS),Windows_NT) EXE := .exe @@ -40,45 +38,20 @@ TITLE := POKEMON EMER GAME_CODE := BPEE MAKER_CODE := 01 REVISION := 0 -MODERN ?= 1 TEST ?= 0 ANALYZE ?= 0 UNUSED_ERROR ?= 0 -ifeq (agbcc,$(MAKECMDGOALS)) - MODERN := 0 -endif - ifeq (check,$(MAKECMDGOALS)) TEST := 1 endif -# use arm-none-eabi-cpp for macOS -# as macOS's default compiler is clang -# and clang's preprocessor will warn on \u -# when preprocessing asm files, expecting a unicode literal -# we can't unconditionally use arm-none-eabi-cpp -# as installations which install binutils-arm-none-eabi -# don't come with it -ifneq ($(MODERN),1) - ifeq ($(shell uname -s),Darwin) - CPP := $(PREFIX)cpp - else - CPP := $(CC) -E - endif -else - CPP := $(PREFIX)cpp -endif +CPP := $(PREFIX)cpp -ROM_NAME := pokeemerald_agbcc.gba +ROM_NAME := pokeemerald.gba ELF_NAME := $(ROM_NAME:.gba=.elf) MAP_NAME := $(ROM_NAME:.gba=.map) -OBJ_DIR_NAME := build/emerald - -MODERN_ROM_NAME := pokeemerald.gba -MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf) -MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map) -MODERN_OBJ_DIR_NAME := build/modern +OBJ_DIR_NAME := build/modern SHELL := bash -o pipefail @@ -86,14 +59,8 @@ ELF = $(ROM:.gba=.elf) MAP = $(ROM:.gba=.map) SYM = $(ROM:.gba=.sym) -TEST_OBJ_DIR_NAME_MODERN := build/modern-test -TEST_OBJ_DIR_NAME_AGBCC := build/test +TEST_OBJ_DIR_NAME := build/modern-test -ifeq ($(MODERN),0) -TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_AGBCC) -else -TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_MODERN) -endif TESTELF = $(ROM:.gba=-test.elf) HEADLESSELF = $(ROM:.gba=-test-headless.elf) @@ -116,17 +83,9 @@ SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR) MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR) TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR) -ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN) +ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=1 -ifeq ($(MODERN),0) -CC1 := tools/agbcc/bin/agbcc$(EXE) -override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g -ROM := $(ROM_NAME) -OBJ_DIR := $(OBJ_DIR_NAME) -LIBPATH := -L ../../tools/agbcc/lib -LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall -else -CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet +CC1 = $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init ifeq ($(ANALYZE),1) override CFLAGS += -fanalyzer @@ -137,11 +96,10 @@ ifneq ($(GITHUB_REPOSITORY_OWNER),rh-hideout) override CFLAGS += -Wno-error=unused-variable -Wno-error=unused-const-variable -Wno-error=unused-parameter -Wno-error=unused-function -Wno-error=unused-but-set-parameter -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=unused-local-typedefs endif endif -ROM := $(MODERN_ROM_NAME) -OBJ_DIR := $(MODERN_OBJ_DIR_NAME) -LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))" +ROM := $(ROM_NAME) +OBJ_DIR := $(OBJ_DIR_NAME) +LIBPATH := -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libc.a))" LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall -endif ifeq ($(TESTELF),$(MAKECMDGOALS)) TEST := 1 @@ -151,10 +109,7 @@ ifeq ($(TEST),1) OBJ_DIR := $(TEST_OBJ_DIR_NAME) endif -CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN) -DTESTING=$(TEST) -ifneq ($(MODERN),1) -CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef -endif +CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c GFX := tools/gbagfx/gbagfx$(EXE) @@ -301,26 +256,17 @@ mostlyclean: tidynonmodern tidymodern tidycheck rm -f $(AUTO_GEN_TARGETS) @$(MAKE) clean -C libagbsyscall -tidy: tidynonmodern tidymodern tidycheck +tidy: tidymodern tidycheck -tidynonmodern: +tidymodern: rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME) rm -rf $(OBJ_DIR_NAME) -tidymodern: - rm -f $(MODERN_ROM_NAME) $(MODERN_ELF_NAME) $(MODERN_MAP_NAME) - rm -rf $(MODERN_OBJ_DIR_NAME) - tidycheck: rm -f $(TESTELF) $(HEADLESSELF) - rm -rf $(TEST_OBJ_DIR_NAME_MODERN) - rm -rf $(TEST_OBJ_DIR_NAME_AGBCC) + rm -rf $(TEST_OBJ_DIR_NAME) -ifneq ($(MODERN),0) -$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member -endif - include graphics_file_rules.mk include map_data_rules.mk include spritesheet_rules.mk @@ -349,27 +295,11 @@ ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) %.h: %.party tools ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - endif -ifeq ($(MODERN),0) -$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE) -$(C_BUILDDIR)/libc.o: CFLAGS := -O2 - -$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork - -$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork -$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork -$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork - -$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE) - -$(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding -$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE) -$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet -else +$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init # Annoyingly we can't turn this on just for src/data/trainers.h $(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret -endif ifeq ($(DINFO),1) override CFLAGS += -g @@ -488,13 +418,8 @@ $1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2) endef $(foreach src, $(TEST_SRCS), $(eval $(call TEST_DEP,$(patsubst $(TEST_SUBDIR)/%.c,$(TEST_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(TEST_SUBDIR)/%.c,%,$(src))))) -ifeq ($(MODERN),0) -LD_SCRIPT := ld_script.ld -LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld -else LD_SCRIPT := ld_script_modern.ld LD_SCRIPT_DEPS := -endif $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld @@ -541,7 +466,7 @@ check: $(TESTELF) $(ROMTESTHYDRA) $(ROMTEST) $(OBJCOPY) $(HEADLESSELF) libagbsyscall: - @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN) + @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1 ################### ### Symbol file ### diff --git a/common_syms/AgbRfu_LinkManager.txt b/common_syms/AgbRfu_LinkManager.txt deleted file mode 100644 index 7ff8cd53dd..0000000000 --- a/common_syms/AgbRfu_LinkManager.txt +++ /dev/null @@ -1 +0,0 @@ -lman diff --git a/common_syms/agb_flash.txt b/common_syms/agb_flash.txt deleted file mode 100644 index cb421ec80d..0000000000 --- a/common_syms/agb_flash.txt +++ /dev/null @@ -1,10 +0,0 @@ -gFlashTimeoutFlag -PollFlashStatus -WaitForFlashWrite -ProgramFlashSector -gFlash -ProgramFlashByte -gFlashNumRemainingBytes -EraseFlashChip -EraseFlashSector -gFlashMaxTime diff --git a/common_syms/apprentice.txt b/common_syms/apprentice.txt deleted file mode 100644 index 0d3569dcbb..0000000000 --- a/common_syms/apprentice.txt +++ /dev/null @@ -1,3 +0,0 @@ -gApprenticePartyMovesData -gApprenticeQuestionData -gApprenticeFunc diff --git a/common_syms/battle_anim_throw.txt b/common_syms/battle_anim_throw.txt deleted file mode 100755 index 5e2e8b3ff3..0000000000 --- a/common_syms/battle_anim_throw.txt +++ /dev/null @@ -1,3 +0,0 @@ -gMonShrinkDuration -gMonShrinkDelta -gMonShrinkDistance diff --git a/common_syms/battle_controllers.txt b/common_syms/battle_controllers.txt deleted file mode 100644 index 0b3c25266a..0000000000 --- a/common_syms/battle_controllers.txt +++ /dev/null @@ -1,3 +0,0 @@ -gBattlerControllerFuncs -gBattleControllerData -gBattlerControllerEndFuncs diff --git a/common_syms/battle_factory_screen.txt b/common_syms/battle_factory_screen.txt deleted file mode 100644 index 3ddeb6d3b1..0000000000 --- a/common_syms/battle_factory_screen.txt +++ /dev/null @@ -1 +0,0 @@ -gFactorySelect_CurrentOptionFunc diff --git a/common_syms/battle_main.txt b/common_syms/battle_main.txt deleted file mode 100644 index 7a9faa5a13..0000000000 --- a/common_syms/battle_main.txt +++ /dev/null @@ -1,7 +0,0 @@ -gPreBattleCallback1 -gBattleMainFunc -gBattleResults -gLeveledUpInBattle -gHealthboxSpriteIds -gMultiUsePlayerCursor -gNumberOfMovesToChoose diff --git a/common_syms/battle_tower.txt b/common_syms/battle_tower.txt deleted file mode 100644 index 7371109d51..0000000000 --- a/common_syms/battle_tower.txt +++ /dev/null @@ -1 +0,0 @@ -gFrontierTempParty diff --git a/common_syms/berry_blender.txt b/common_syms/berry_blender.txt deleted file mode 100644 index 1b15a33d61..0000000000 --- a/common_syms/berry_blender.txt +++ /dev/null @@ -1 +0,0 @@ -gInGameOpponentsNo diff --git a/common_syms/bg.txt b/common_syms/bg.txt deleted file mode 100644 index 0a3c3aecca..0000000000 --- a/common_syms/bg.txt +++ /dev/null @@ -1 +0,0 @@ -gWindowTileAutoAllocEnabled diff --git a/common_syms/contest.txt b/common_syms/contest.txt deleted file mode 100644 index 6a519fb463..0000000000 --- a/common_syms/contest.txt +++ /dev/null @@ -1 +0,0 @@ -gContestRngValue diff --git a/common_syms/contest_painting.txt b/common_syms/contest_painting.txt deleted file mode 100644 index 32bb8be161..0000000000 --- a/common_syms/contest_painting.txt +++ /dev/null @@ -1,4 +0,0 @@ -gContestMonPixels -gImageProcessingContext -gContestPaintingWinner -gContestPaintingMonPalette diff --git a/common_syms/ereader_screen.txt b/common_syms/ereader_screen.txt deleted file mode 100644 index 2189eedbc9..0000000000 --- a/common_syms/ereader_screen.txt +++ /dev/null @@ -1 +0,0 @@ -gEReaderData diff --git a/common_syms/evolution_scene.txt b/common_syms/evolution_scene.txt deleted file mode 100644 index 137cd3e05d..0000000000 --- a/common_syms/evolution_scene.txt +++ /dev/null @@ -1 +0,0 @@ -gCB2_AfterEvolution diff --git a/common_syms/faraway_island.txt b/common_syms/faraway_island.txt deleted file mode 100755 index e02ca2ec25..0000000000 --- a/common_syms/faraway_island.txt +++ /dev/null @@ -1,3 +0,0 @@ -sPlayerToMewDeltaX -sPlayerToMewDeltaY -sMewDirectionCandidates diff --git a/common_syms/field_camera.txt b/common_syms/field_camera.txt deleted file mode 100644 index 02301ce23c..0000000000 --- a/common_syms/field_camera.txt +++ /dev/null @@ -1,3 +0,0 @@ -gFieldCamera -gTotalCameraPixelOffsetY -gTotalCameraPixelOffsetX diff --git a/common_syms/field_control_avatar.txt b/common_syms/field_control_avatar.txt deleted file mode 100644 index 268f60c641..0000000000 --- a/common_syms/field_control_avatar.txt +++ /dev/null @@ -1 +0,0 @@ -gSelectedObjectEvent diff --git a/common_syms/field_specials.txt b/common_syms/field_specials.txt deleted file mode 100644 index 7adb3f6692..0000000000 --- a/common_syms/field_specials.txt +++ /dev/null @@ -1 +0,0 @@ -gScrollableMultichoice_ListMenuTemplate diff --git a/common_syms/fieldmap.txt b/common_syms/fieldmap.txt deleted file mode 100644 index 0ead758462..0000000000 --- a/common_syms/fieldmap.txt +++ /dev/null @@ -1 +0,0 @@ -gBackupMapLayout diff --git a/common_syms/image_processing_effects.txt b/common_syms/image_processing_effects.txt deleted file mode 100644 index 134f7e88b2..0000000000 --- a/common_syms/image_processing_effects.txt +++ /dev/null @@ -1,10 +0,0 @@ -gCanvasColumnStart -gCanvasPixels -gCanvasRowEnd -gCanvasHeight -gCanvasColumnEnd -gCanvasRowStart -gCanvasMonPersonality -gCanvasWidth -gCanvasPalette -gCanvasPaletteStart diff --git a/common_syms/intro.txt b/common_syms/intro.txt deleted file mode 100644 index d069b1014f..0000000000 --- a/common_syms/intro.txt +++ /dev/null @@ -1,2 +0,0 @@ -gIntroFrameCounter -gMultibootProgramStruct diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt deleted file mode 100644 index 4b742dcd25..0000000000 --- a/common_syms/librfu_rfu.txt +++ /dev/null @@ -1,5 +0,0 @@ -gRfuSlotStatusUNI -gRfuSlotStatusNI -gRfuLinkStatus -gRfuStatic -gRfuFixed diff --git a/common_syms/librfu_sio32id.txt b/common_syms/librfu_sio32id.txt deleted file mode 100644 index 97395e84b3..0000000000 --- a/common_syms/librfu_sio32id.txt +++ /dev/null @@ -1 +0,0 @@ -gRfuSIO32Id diff --git a/common_syms/librfu_stwi.txt b/common_syms/librfu_stwi.txt deleted file mode 100644 index a1f7735535..0000000000 --- a/common_syms/librfu_stwi.txt +++ /dev/null @@ -1 +0,0 @@ -gSTWIStatus diff --git a/common_syms/link.txt b/common_syms/link.txt deleted file mode 100644 index 4118d1eb4b..0000000000 --- a/common_syms/link.txt +++ /dev/null @@ -1,35 +0,0 @@ -gLinkPartnersHeldKeys -gLinkDebugSeed -gLocalLinkPlayerBlock -gLinkErrorOccurred -gLinkDebugFlags -gLinkFiller1 -gRemoteLinkPlayersNotReceived -gBlockReceivedStatus -gLinkFiller2 -gLinkHeldKeys -gRecvCmds -gLinkStatus -gLinkDummy1 -gLinkDummy2 -gReadyToExitStandby -gReadyToCloseLink -gReadyCloseLinkType -gSuppressLinkErrorMessage -gWirelessCommType -gSavedLinkPlayerCount -gSendCmd -gSavedMultiplayerId -gReceivedRemoteLinkPlayers -gLinkTestBGInfo -gLinkCallback -gShouldAdvanceLinkState -gLinkTestBlockChecksums -gBlockRequestType -gLinkFiller3 -gLinkFiller4 -gLinkFiller5 -gLastSendQueueCount -gLink -gLastRecvQueueCount -gLinkSavedIme diff --git a/common_syms/link_rfu_2.txt b/common_syms/link_rfu_2.txt deleted file mode 100644 index 4b8f02bad8..0000000000 --- a/common_syms/link_rfu_2.txt +++ /dev/null @@ -1,2 +0,0 @@ -gRfuAPIBuffer -gRfu diff --git a/common_syms/list_menu.txt b/common_syms/list_menu.txt deleted file mode 100644 index ed5343618c..0000000000 --- a/common_syms/list_menu.txt +++ /dev/null @@ -1,2 +0,0 @@ -gListMenuOverride -gMultiuseListMenuTemplate diff --git a/common_syms/load_save.txt b/common_syms/load_save.txt deleted file mode 100644 index 2d3d9b802f..0000000000 --- a/common_syms/load_save.txt +++ /dev/null @@ -1,4 +0,0 @@ -gFlashMemoryPresent -gSaveBlock1Ptr -gSaveBlock2Ptr -gPokemonStoragePtr diff --git a/common_syms/m4a.txt b/common_syms/m4a.txt deleted file mode 100644 index 0d6b13a79b..0000000000 --- a/common_syms/m4a.txt +++ /dev/null @@ -1,12 +0,0 @@ -gSoundInfo -gPokemonCrySongs -gPokemonCryMusicPlayers -gMPlayInfo_BGM -gMPlayJumpTable -gCgbChans -gMPlayInfo_SE1 -gMPlayInfo_SE2 -gPokemonCryTracks -gPokemonCrySong -gMPlayMemAccArea -gMPlayInfo_SE3 diff --git a/common_syms/main.txt b/common_syms/main.txt deleted file mode 100644 index f1f8076adf..0000000000 --- a/common_syms/main.txt +++ /dev/null @@ -1,10 +0,0 @@ -gKeyRepeatStartDelay -gLinkTransferringData -gMain -gKeyRepeatContinueDelay -gSoftResetDisabled -gIntrTable -gLinkVSyncDisabled -IntrMain_Buffer -gPcmDmaCounter -gAgbMainLoop_sp diff --git a/common_syms/mauville_old_man.txt b/common_syms/mauville_old_man.txt deleted file mode 100644 index 9d77b8692b..0000000000 --- a/common_syms/mauville_old_man.txt +++ /dev/null @@ -1 +0,0 @@ -gBardSong diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt deleted file mode 100644 index dcada0bbef..0000000000 --- a/common_syms/overworld.txt +++ /dev/null @@ -1,8 +0,0 @@ -gOverworldTilemapBuffer_Bg2 -gOverworldTilemapBuffer_Bg1 -gOverworldTilemapBuffer_Bg3 -gHeldKeyCodeToSend -gFieldCallback -gFieldCallback2 -gLocalLinkPlayerId -gFieldLinkPlayerCount diff --git a/common_syms/party_menu.txt b/common_syms/party_menu.txt deleted file mode 100644 index 6ed37392c2..0000000000 --- a/common_syms/party_menu.txt +++ /dev/null @@ -1 +0,0 @@ -gItemUseCB diff --git a/common_syms/pokedex.txt b/common_syms/pokedex.txt deleted file mode 100644 index c7a297b2af..0000000000 --- a/common_syms/pokedex.txt +++ /dev/null @@ -1,2 +0,0 @@ -gUnusedPokedexU8 -gPokedexVBlankCB diff --git a/common_syms/pokedex_cry_screen.txt b/common_syms/pokedex_cry_screen.txt deleted file mode 100644 index d16ec36d64..0000000000 --- a/common_syms/pokedex_cry_screen.txt +++ /dev/null @@ -1 +0,0 @@ -gDexCryScreenState diff --git a/common_syms/random.txt b/common_syms/random.txt deleted file mode 100644 index 8037c69586..0000000000 --- a/common_syms/random.txt +++ /dev/null @@ -1,2 +0,0 @@ -gRngValue -gRng2Value diff --git a/common_syms/rtc.txt b/common_syms/rtc.txt deleted file mode 100644 index fa00a34d51..0000000000 --- a/common_syms/rtc.txt +++ /dev/null @@ -1 +0,0 @@ -gLocalTime diff --git a/common_syms/save.txt b/common_syms/save.txt deleted file mode 100644 index 131031d506..0000000000 --- a/common_syms/save.txt +++ /dev/null @@ -1,13 +0,0 @@ -gLastWrittenSector -gLastSaveCounter -gLastKnownGoodSector -gDamagedSaveSectors -gSaveCounter -gReadWriteSector -gIncrementalSectorId -gSaveUnusedVar -gSaveFileStatus -gGameContinueCallback -gRamSaveSectorLocations -gSaveUnusedVar2 -gSaveAttemptStatus diff --git a/common_syms/sound.txt b/common_syms/sound.txt deleted file mode 100644 index 0f6f2fc758..0000000000 --- a/common_syms/sound.txt +++ /dev/null @@ -1 +0,0 @@ -gDisableMusic diff --git a/common_syms/sprite.txt b/common_syms/sprite.txt deleted file mode 100644 index 627c01c0d0..0000000000 --- a/common_syms/sprite.txt +++ /dev/null @@ -1,2 +0,0 @@ -gOamMatrixAllocBitmap -gReservedSpritePaletteCount diff --git a/common_syms/start_menu.txt b/common_syms/start_menu.txt deleted file mode 100644 index 05beaf57c2..0000000000 --- a/common_syms/start_menu.txt +++ /dev/null @@ -1 +0,0 @@ -gMenuCallback diff --git a/common_syms/task.txt b/common_syms/task.txt deleted file mode 100644 index 6601bd11bb..0000000000 --- a/common_syms/task.txt +++ /dev/null @@ -1 +0,0 @@ -gTasks diff --git a/common_syms/text.txt b/common_syms/text.txt deleted file mode 100644 index cd8886e5b1..0000000000 --- a/common_syms/text.txt +++ /dev/null @@ -1,4 +0,0 @@ -gFonts -gDisableTextPrinters -gCurGlyph -gTextFlags diff --git a/common_syms/trainer_see.txt b/common_syms/trainer_see.txt deleted file mode 100644 index 0b30a632a0..0000000000 --- a/common_syms/trainer_see.txt +++ /dev/null @@ -1,5 +0,0 @@ -gWhichTrainerToFaceAfterBattle -gPostBattleMovementScript -gApproachingTrainers -gNoOfApproachingTrainers -gTrainerApproachedPlayer diff --git a/common_syms/tv.txt b/common_syms/tv.txt deleted file mode 100644 index 0370f65e1f..0000000000 --- a/common_syms/tv.txt +++ /dev/null @@ -1,4 +0,0 @@ -sCurTVShowSlot -sTV_SecretBaseVisitMovesTemp -sTV_DecorationsBuffer -sTV_SecretBaseVisitMonsTemp diff --git a/common_syms/window.txt b/common_syms/window.txt deleted file mode 100644 index 24c093a226..0000000000 --- a/common_syms/window.txt +++ /dev/null @@ -1,2 +0,0 @@ -gTransparentTileNumber -gWindowBgTilemapBuffers diff --git a/ld_script.ld b/ld_script.ld deleted file mode 100644 index a0c069c965..0000000000 --- a/ld_script.ld +++ /dev/null @@ -1,1391 +0,0 @@ -ENTRY(Start) - -gNumMusicPlayers = 4; -gMaxLines = 0; -gInitialMainCB2 = CB2_InitCopyrightScreenAfterBootup; - -MEMORY -{ - EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K - IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K - ROM (rx) : ORIGIN = 0x8000000, LENGTH = 32M -} - -SECTIONS { - - .ewram ORIGIN(EWRAM) : AT (__ewram_lma) - ALIGN(4) - { - __ewram_start = .; - *(.ewram*) - __ewram_end = .; - } > EWRAM - - .ewram.sbss (NOLOAD) : - ALIGN(4) - { - INCLUDE "sym_ewram.ld" - src/*.o(.sbss); - gflib/*.o(.sbss); - - *libc.a:impure.o(.data); - *libc.a:locale.o(.data); - *libc.a:mallocr.o(.data); - } > EWRAM - - .iwram ORIGIN(IWRAM) : AT (__iwram_lma) - ALIGN(4) - { - __iwram_start = .; - *(.iwram*); - __iwram_end = .; - } > IWRAM - - .iwram.bss (NOLOAD) : - ALIGN(4) - { - /* .bss starts at 0x3000000 */ - INCLUDE "sym_bss.ld" - src/*.o(.bss); - gflib/*.o(.bss); - data/*.o(.bss); - - /* .bss.code starts at 0x3001AA8 */ - src/m4a.o(.bss.code); - - /* COMMON starts at 0x30022A8 */ - INCLUDE "sym_common.ld" - *libc.a:sbrkr.o(COMMON); - } > IWRAM - - /* BEGIN ROM DATA */ - . = 0x8000000; - - .text : - ALIGN(4) - { - src/rom_header.o(.text); - src/rom_header_gf.o(.text.*); - src/rom_header_rhh.o(.text.*); - src/crt0.o(.text); - src/main.o(.text); - gflib/malloc.o(.text); - gflib/dma3_manager.o(.text); - gflib/gpu_regs.o(.text); - gflib/bg.o(.text); - gflib/blit.o(.text); - gflib/window.o(.text); - gflib/text.o(.text); - gflib/sprite.o(.text); - gflib/string_util.o(.text); - src/link.o(.text); - src/AgbRfu_LinkManager.o(.text); - src/link_rfu_3.o(.text); - src/link_rfu_2.o(.text); - src/union_room.o(.text); - src/mystery_gift_menu.o(.text); - src/union_room_player_avatar.o(.text); - src/wireless_communication_status_screen.o(.text); - src/union_room_battle.o(.text); - src/mystery_gift.o(.text); - src/mystery_gift_view.o(.text); - src/mystery_gift_server.o(.text); - src/mystery_gift_client.o(.text); - src/mystery_gift_link.o(.text); - src/wonder_news.o(.text); - src/union_room_chat.o(.text); - src/berry_crush.o(.text); - src/berry_powder.o(.text); - src/dodrio_berry_picking.o(.text); - src/pokemon_jump.o(.text); - src/minigame_countdown.o(.text); - src/rtc.o(.text); - src/main_menu.o(.text); - src/battle_controllers.o(.text); - src/decompress.o(.text); - src/digit_obj_util.o(.text); - src/battle_bg.o(.text); - src/battle_main.o(.text); - src/battle_util.o(.text); - src/battle_z_move.o(.text); - src/battle_script_commands.o(.text); - src/battle_util2.o(.text); - src/battle_controller_player.o(.text); - src/battle_gfx_sfx_util.o(.text); - src/battle_controller_opponent.o(.text); - src/battle_ai_switch_items.o(.text); - src/battle_controller_link_opponent.o(.text); - src/battle_debug.o(.text); - src/pokemon.o(.text); - src/trig.o(.text); - src/random.o(.text); - src/util.o(.text); - src/daycare.o(.text); - src/egg_hatch.o(.text); - src/battle_interface.o(.text); - src/battle_anim_smokescreen.o(.text); - src/pokeball.o(.text); - src/load_save.o(.text); - src/trade.o(.text); - src/berry_blender.o(.text); - src/play_time.o(.text); - src/new_game.o(.text); - src/overworld.o(.text); - src/fieldmap.o(.text); - src/metatile_behavior.o(.text); - src/field_camera.o(.text); - src/field_door.o(.text); - src/field_player_avatar.o(.text); - src/event_object_movement.o(.text); - src/follower_helper.o(.text); - src/field_message_box.o(.text); - src/event_object_lock.o(.text); - src/text_window.o(.text); - src/script.o(.text); - src/scrcmd.o(.text); - src/field_control_avatar.o(.text); - src/event_data.o(.text); - src/coord_event_weather.o(.text); - src/field_tasks.o(.text); - src/clock.o(.text); - src/reset_rtc_screen.o(.text); - src/start_menu.o(.text); - src/tileset_anims.o(.text); - src/palette.o(.text); - src/sound.o(.text); - src/battle_anim.o(.text); - src/battle_anim_mons.o(.text); - src/task.o(.text); - src/reshow_battle_screen.o(.text); - src/battle_anim_status_effects.o(.text); - src/title_screen.o(.text); - src/field_weather.o(.text); - src/field_weather_effect.o(.text); - src/field_screen_effect.o(.text); - src/battle_setup.o(.text); - src/cable_club.o(.text); - src/trainer_see.o(.text); - src/wild_encounter.o(.text); - src/field_effect.o(.text); - src/scanline_effect.o(.text); - src/option_menu.o(.text); - src/pokedex.o(.text); - src/trainer_card.o(.text); - src/frontier_pass.o(.text); - src/pokemon_storage_system.o(.text); - src/pokemon_icon.o(.text); - src/script_movement.o(.text); - src/fldeff_cut.o(.text); - src/mail_data.o(.text); - src/map_name_popup.o(.text); - src/item_menu_icons.o(.text); - src/battle_anim_mon_movement.o(.text); - src/item.o(.text); - src/contest.o(.text); - src/shop.o(.text); - src/fldeff_escalator.o(.text); - src/berry.o(.text); - src/script_menu.o(.text); - src/naming_screen.o(.text); - src/money.o(.text); - src/contest_effect.o(.text); - src/record_mixing.o(.text); - src/secret_base.o(.text); - src/tv.o(.text); - src/contest_util.o(.text); - src/script_pokemon_util.o(.text); - src/field_poison.o(.text); - src/pokemon_size_record.o(.text); - src/fldeff_misc.o(.text); - src/field_special_scene.o(.text); - src/rotating_gate.o(.text); - src/safari_zone.o(.text); - src/contest_link.o(.text); - src/item_use.o(.text); - src/battle_anim_effects_1.o(.text); - src/battle_anim_effects_2.o(.text); - src/battle_anim_water.o(.text); - src/battle_anim_fire.o(.text); - src/battle_anim_electric.o(.text); - src/battle_anim_ice.o(.text); - src/battle_anim_fight.o(.text); - src/battle_anim_poison.o(.text); - src/battle_anim_flying.o(.text); - src/battle_anim_psychic.o(.text); - src/battle_anim_bug.o(.text); - src/battle_anim_rock.o(.text); - src/battle_anim_ghost.o(.text); - src/battle_anim_dragon.o(.text); - src/battle_anim_dark.o(.text); - 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); - src/mon_markings.o(.text); - src/mauville_old_man.o(.text); - src/mail.o(.text); - src/menu_helpers.o(.text); - src/dewford_trend.o(.text); - src/heal_location.o(.text); - src/region_map.o(.text); - src/image_processing_effects.o(.text); - src/decoration.o(.text); - src/slot_machine.o(.text); - src/contest_painting.o(.text); - src/battle_ai_main.o(.text); - src/battle_ai_util.o(.text); - src/trader.o(.text); - src/starter_choose.o(.text); - src/wallclock.o(.text); - src/fldeff_rocksmash.o(.text); - src/fldeff_dig.o(.text); - src/pokeblock.o(.text); - src/fldeff_flash.o(.text); - src/post_battle_event_funcs.o(.text); - src/time_events.o(.text); - src/birch_pc.o(.text); - src/hof_pc.o(.text); - src/field_specials.o(.text); - src/battle_records.o(.text); - src/pokedex_area_screen.o(.text); - src/evolution_scene.o(.text); - src/roulette.o(.text); - src/pokedex_cry_screen.o(.text); - src/coins.o(.text); - src/landmark.o(.text); - src/fldeff_strength.o(.text); - src/battle_transition.o(.text); - src/battle_controller_link_partner.o(.text); - src/battle_message.o(.text); - src/cable_car.o(.text); - src/math_util.o(.text); - src/palette_util.o(.text); - src/confetti_util.o(.text); - src/save.o(.text); - src/mystery_event_script.o(.text); - src/field_effect_helpers.o(.text); - src/contest_ai.o(.text); - src/battle_anim_sound_tasks.o(.text); - src/battle_controller_safari.o(.text); - src/fldeff_sweetscent.o(.text); - src/battle_anim_effects_3.o(.text); - src/move_relearner.o(.text); - src/fldeff_softboiled.o(.text); - src/decoration_inventory.o(.text); - src/roamer.o(.text); - src/battle_tower.o(.text); - src/use_pokeblock.o(.text); - src/battle_controller_wally.o(.text); - src/player_pc.o(.text); - src/intro.o(.text); - src/reload_save.o(.text); - src/field_region_map.o(.text); - src/battle_anim_throw.o(.text); - src/hall_of_fame.o(.text); - src/credits.o(.text); - src/lottery_corner.o(.text); - src/diploma.o(.text); - src/berry_tag_screen.o(.text); - src/mystery_event_menu.o(.text); - src/save_failed_screen.o(.text); - src/braille_puzzles.o(.text); - src/pokeblock_feed.o(.text); - src/clear_save_data_screen.o(.text); - src/intro_credits_graphics.o(.text); - src/evolution_graphics.o(.text); - src/bard_music.o(.text); - src/fldeff_teleport.o(.text); - src/battle_tv.o(.text); - src/pokemon_animation.o(.text); - src/recorded_battle.o(.text); - src/battle_controller_recorded_opponent.o(.text); - src/battle_controller_recorded_player.o(.text); - src/trainer_pokemon_sprites.o(.text); - src/lilycove_lady.o(.text); - src/battle_dome.o(.text); - src/battle_palace.o(.text); - src/match_call.o(.text); - src/menu.o(.text); - src/battle_factory_screen.o(.text); - src/apprentice.o(.text); - src/frontier_util.o(.text); - src/battle_arena.o(.text); - src/battle_factory.o(.text); - src/battle_pike.o(.text); - src/rotating_tile_puzzle.o(.text); - src/battle_pyramid.o(.text); - src/item_menu.o(.text); - src/list_menu.o(.text); - src/dynamic_placeholder_text_util.o(.text); - src/save_location.o(.text); - src/item_icon.o(.text); - src/party_menu.o(.text); - src/battle_tent.o(.text); - src/braille.o(.text); - src/multiboot.o(.text); - src/berry_fix_graphics.o(.text); - src/battle_controller_player_partner.o(.text); - src/mirage_tower.o(.text); - src/berry_fix_program.o(.text); - src/pokemon_summary_screen.o(.text); - src/pokedex_area_region_map.o(.text); - src/battle_pyramid_bag.o(.text); - src/pokenav.o(.text); - src/pokenav_main_menu.o(.text); - src/pokenav_list.o(.text); - src/pokenav_menu_handler.o(.text); - src/pokenav_menu_handler_gfx.o(.text); - src/pokenav_match_call_list.o(.text); - src/pokenav_match_call_gfx.o(.text); - src/pokenav_region_map.o(.text); - src/pokenav_conditions.o(.text); - src/pokenav_conditions_gfx.o(.text); - src/pokenav_conditions_search_results.o(.text); - src/pokenav_ribbons_list.o(.text); - src/pokenav_ribbons_summary.o(.text); - src/pokenav_match_call_data.o(.text); - src/menu_specialized.o(.text); - src/ereader_helpers.o(.text); - src/faraway_island.o(.text); - src/ereader_screen.o(.text); - src/trainer_hill.o(.text); - src/rayquaza_scene.o(.text); - src/walda_phrase.o(.text); - src/contest_link_util.o(.text); - src/gym_leader_rematch.o(.text); - src/battle_transition_frontier.o(.text); - src/international_string_util.o(.text); - src/pokemon_sprite_visualizer.o(.text); - src/expansion_intro.o(.text); - } > ROM =0 - - script_data : - ALIGN(4) - { - data/event_scripts.o(script_data); - data/battle_anim_scripts.o(script_data); - data/battle_scripts_1.o(script_data); - data/field_effect_scripts.o(script_data); - data/battle_scripts_2.o(script_data); - data/contest_ai_scripts.o(script_data); - data/mystery_event_script_cmd_table.o(script_data); - } > ROM =0 - - lib_text : - ALIGN(4) - { - src/libgcnmultiboot.o(.text); - src/m4a_1.o(.text); - src/m4a.o(.text); - src/agb_flash.o(.text); - src/agb_flash_1m.o(.text); - src/agb_flash_mx.o(.text); - src/siirtc.o(.text); - src/librfu_stwi.o(.text); - src/librfu_intr.o(.text); - src/librfu_rfu.o(.text); - src/librfu_sio32id.o(.text); - src/libisagbprn.o(.text); - *libagbsyscall.a:ArcTan2.o(.text); - *libagbsyscall.a:BgAffineSet.o(.text); - *libagbsyscall.a:CpuFastSet.o(.text); - *libagbsyscall.a:CpuSet.o(.text); - *libagbsyscall.a:Div.o(.text); - *libagbsyscall.a:LZ77UnCompVram.o(.text); - *libagbsyscall.a:LZ77UnCompWram.o(.text); - *libagbsyscall.a:MultiBoot.o(.text); - *libagbsyscall.a:ObjAffineSet.o(.text); - *libagbsyscall.a:RLUnCompVram.o(.text); - *libagbsyscall.a:RLUnCompWram.o(.text); - *libagbsyscall.a:RegisterRamReset.o(.text); - *libagbsyscall.a:SoftReset.o(.text); - *libagbsyscall.a:Sqrt.o(.text); - *libagbsyscall.a:VBlankIntrWait.o(.text); - *libgcc.a:_call_via_rX.o(.text); - *libgcc.a:_divdi3.o(.text); - *libgcc.a:_divsi3.o(.text); - *libgcc.a:_dvmd_tls.o(.text); - *libgcc.a:_fixunsdfsi.o(.text); - *libgcc.a:_fixunssfsi.o(.text); - *libgcc.a:_modsi3.o(.text); - *libgcc.a:_muldi3.o(.text); - *libgcc.a:_udivdi3.o(.text); - *libgcc.a:_udivsi3.o(.text); - *libgcc.a:_umodsi3.o(.text); - *libgcc.a:dp-bit.o(.text); - *libgcc.a:fp-bit.o(.text); - *libgcc.a:_lshrdi3.o(.text); - *libgcc.a:_negdi2.o(.text); - *libc.a:memcpy.o(.text); - *libc.a:memset.o(.text); - *libc.a:strcmp.o(.text); - *libc.a:strcpy.o(.text); - *libc.a:impure.o(.text); - *libc.a:vsprintf.o(.text); - *libc.a:vfprintf.o(.text); - *libc.a:wsetup.o(.text); - *libc.a:dtoa.o(.text); - *libc.a:fflush.o(.text); - *libc.a:findfp.o(.text); - *libc.a:freer.o(.text); - *libc.a:mtrim.o(.text); - *libc.a:fvwrite.o(.text); - *libc.a:fwalk.o(.text); - *libc.a:locale.o(.text); - *libc.a:makebuf.o(.text); - *libc.a:mallocr.o(.text); - *libc.a:mbtowc_r.o(.text); - *libc.a:memchr.o(.text); - *libc.a:memmove.o(.text); - *libc.a:mlock.o(.text); - *libc.a:mprec.o(.text); - *libc.a:s_isinf.o(.text); - *libc.a:s_isnan.o(.text); - *libc.a:sbrkr.o(.text); - *libc.a:stdio.o(.text); - *libc.a:strlen.o(.text); - *libc.a:syscalls.o(.text); - *libc.a:writer.o(.text); - *libc.a:callocr.o(.text); - *libc.a:closer.o(.text); - *libc.a:errno.o(.text); - *libc.a:fstatr.o(.text); - *libc.a:libcfunc.o(.text); - *libc.a:lseekr.o(.text); - *libc.a:readr.o(.text); - } > ROM =0 - - .rodata : - ALIGN(4) - { - src/rom_header.o(.rodata); - src/rom_header_gf.o(.rodata); - src/main.o(.rodata); - gflib/bg.o(.rodata); - gflib/window.o(.rodata); - gflib/text.o(.rodata); - gflib/sprite.o(.rodata); - gflib/io_reg.o(.rodata); - gflib/string_util.o(.rodata); - src/link.o(.rodata); - src/link.o(.rodata.str1.4); - src/AgbRfu_LinkManager.o(.rodata); - src/link_rfu_3.o(.rodata); - src/link_rfu_2.o(.rodata); - src/link_rfu_2.o(.rodata.str1.4); - src/union_room.o(.rodata); - src/mystery_gift_menu.o(.rodata); - src/union_room_player_avatar.o(.rodata); - src/wireless_communication_status_screen.o(.rodata); - src/union_room_battle.o(.rodata); - src/mystery_gift.o(.rodata); - src/mystery_gift_view.o(.rodata); - src/mystery_gift_server.o(.rodata); - src/mystery_gift_client.o(.rodata); - src/mystery_gift_scripts.o(.rodata); - src/wonder_news.o(.rodata); - src/union_room_chat.o(.rodata); - src/berry_crush.o(.rodata); - src/berry_powder.o(.rodata); - src/dodrio_berry_picking.o(.rodata); - src/pokemon_jump.o(.rodata); - src/minigame_countdown.o(.rodata); - src/rtc.o(.rodata); - src/main_menu.o(.rodata); - src/battle_controllers.o(.rodata); - src/digit_obj_util.o(.rodata); - src/data.o(.rodata); - src/battle_bg.o(.rodata); - src/battle_main.o(.rodata); - src/battle_util.o(.rodata); - src/battle_z_move.o(.rodata); - src/battle_script_commands.o(.rodata); - src/battle_controller_player.o(.rodata); - src/battle_anim_smokescreen.o(.rodata); - src/battle_controller_opponent.o(.rodata); - src/battle_ai_switch_items.o(.rodata); - src/battle_controller_link_opponent.o(.rodata); - src/battle_debug.o(.rodata); - src/pokemon.o(.rodata); - src/trig.o(.rodata); - src/util.o(.rodata); - src/daycare.o(.rodata); - src/egg_hatch.o(.rodata); - src/battle_gfx_sfx_util.o(.rodata); - src/battle_interface.o(.rodata); - src/pokeball.o(.rodata); - src/trade.o(.rodata); - src/berry_blender.o(.rodata); - src/new_game.o(.rodata); - src/overworld.o(.rodata); - src/tilesets.o(.rodata); - data/maps.o(.rodata); - src/fieldmap.o(.rodata); - src/metatile_behavior.o(.rodata); - src/field_door.o(.rodata); - src/field_player_avatar.o(.rodata); - src/event_object_movement.o(.rodata); - src/follower_helper.o(.rodata); - src/text_window.o(.rodata); - src/scrcmd.o(.rodata); - src/field_control_avatar.o(.rodata); - src/coord_event_weather.o(.rodata); - src/field_tasks.o(.rodata); - src/reset_rtc_screen.o(.rodata); - src/start_menu.o(.rodata); - src/tileset_anims.o(.rodata); - src/palette.o(.rodata); - src/sound.o(.rodata); - src/battle_anim.o(.rodata); - src/battle_anim_mons.o(.rodata); - data/map_events.o(.rodata); - src/reshow_battle_screen.o(.rodata); - src/battle_anim_status_effects.o(.rodata); - src/title_screen.o(.rodata); - src/field_weather.o(.rodata); - src/field_weather_effect.o(.rodata); - src/field_screen_effect.o(.rodata); - src/battle_setup.o(.rodata); - src/cable_club.o(.rodata); - src/trainer_see.o(.rodata); - src/wild_encounter.o(.rodata); - src/field_effect.o(.rodata); - src/scanline_effect.o(.rodata); - src/option_menu.o(.rodata); - src/pokedex.o(.rodata); - src/trainer_card.o(.rodata); - src/frontier_pass.o(.rodata); - src/pokemon_storage_system.o(.rodata); - src/pokemon_icon.o(.rodata); - src/fldeff_cut.o(.rodata); - src/map_name_popup.o(.rodata); - src/item_menu_icons.o(.rodata); - src/battle_anim_mon_movement.o(.rodata); - src/item.o(.rodata); - src/contest.o(.rodata); - src/shop.o(.rodata); - src/fldeff_escalator.o(.rodata); - src/berry.o(.rodata); - src/script_menu.o(.rodata); - src/naming_screen.o(.rodata); - src/money.o(.rodata); - src/contest_effect.o(.rodata); - src/record_mixing.o(.rodata); - src/secret_base.o(.rodata); - src/tv.o(.rodata); - src/contest_util.o(.rodata); - src/script_pokemon_util.o(.rodata); - src/pokemon_size_record.o(.rodata) - src/fldeff_misc.o(.rodata); - src/field_special_scene.o(.rodata); - src/rotating_gate.o(.rodata); - src/contest_link.o(.rodata); - src/item_use.o(.rodata); - src/battle_anim_effects_1.o(.rodata); - src/battle_anim_effects_2.o(.rodata); - src/battle_anim_water.o(.rodata); - src/battle_anim_fire.o(.rodata); - src/battle_anim_electric.o(.rodata); - src/battle_anim_ice.o(.rodata); - src/battle_anim_fight.o(.rodata); - src/battle_anim_poison.o(.rodata); - src/battle_anim_flying.o(.rodata); - src/battle_anim_psychic.o(.rodata); - src/battle_anim_bug.o(.rodata); - src/battle_anim_rock.o(.rodata); - src/battle_anim_ghost.o(.rodata); - src/battle_anim_dragon.o(.rodata); - src/battle_anim_dark.o(.rodata); - 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); - src/mon_markings.o(.rodata); - src/mauville_old_man.o(.rodata); - src/mail.o(.rodata); - src/menu_helpers.o(.rodata); - src/heal_location.o(.rodata); - src/region_map.o(.rodata); - src/image_processing_effects.o(.rodata); - src/decoration.o(.rodata); - src/slot_machine.o(.rodata); - src/contest_painting.o(.rodata); - src/battle_ai_main.o(.rodata); - src/battle_ai_util.o(.rodata); - src/trader.o(.rodata); - src/starter_choose.o(.rodata); - src/wallclock.o(.rodata); - src/pokeblock.o(.rodata); - src/fldeff_flash.o(.rodata); - src/time_events.o(.rodata); - src/field_specials.o(.rodata); - src/battle_records.o(.rodata); - src/pokedex_area_screen.o(.rodata); - src/evolution_scene.o(.rodata); - src/roulette.o(.rodata); - src/pokedex_cry_screen.o(.rodata); - src/landmark.o(.rodata); - src/battle_transition.o(.rodata); - src/battle_controller_link_partner.o(.rodata); - src/battle_message.o(.rodata); - src/cable_car.o(.rodata); - src/save.o(.rodata); - src/field_effect_helpers.o(.rodata); - src/contest_ai.o(.rodata); - src/battle_anim_sound_tasks.o(.rodata); - src/battle_controller_safari.o(.rodata); - src/battle_anim_effects_3.o(.rodata); - src/move_relearner.o(.rodata); - src/roamer.o(.rodata); - src/battle_tower.o(.rodata); - src/use_pokeblock.o(.rodata); - src/battle_controller_wally.o(.rodata); - src/player_pc.o(.rodata); - src/intro.o(.rodata); - src/field_region_map.o(.rodata); - src/battle_anim_throw.o(.rodata); - src/hall_of_fame.o(.rodata); - src/credits.o(.rodata); - src/lottery_corner.o(.rodata); - src/diploma.o(.rodata); - src/strings.o(.rodata); - src/berry_tag_screen.o(.rodata); - src/mystery_event_menu.o(.rodata); - src/save_failed_screen.o(.rodata); - src/braille_puzzles.o(.rodata); - src/pokeblock_feed.o(.rodata); - src/clear_save_data_screen.o(.rodata); - src/intro_credits_graphics.o(.rodata); - src/evolution_graphics.o(.rodata); - src/bard_music.o(.rodata); - src/battle_tv.o(.rodata); - src/pokemon_animation.o(.rodata); - src/battle_controller_recorded_opponent.o(.rodata); - src/battle_controller_recorded_player.o(.rodata); - src/trainer_pokemon_sprites.o(.rodata); - src/lilycove_lady.o(.rodata); - src/battle_dome.o(.rodata); - src/battle_palace.o(.rodata); - src/match_call.o(.rodata); - src/menu.o(.rodata); - src/battle_factory_screen.o(.rodata); - src/apprentice.o(.rodata); - src/frontier_util.o(.rodata); - src/battle_arena.o(.rodata); - src/battle_factory.o(.rodata); - src/battle_pike.o(.rodata); - src/rotating_tile_puzzle.o(.rodata); - src/battle_pyramid.o(.rodata); - src/item_menu.o(.rodata); - src/list_menu.o(.rodata); - src/save_location.o(.rodata); - src/item_icon.o(.rodata); - src/party_menu.o(.rodata); - src/battle_tent.o(.rodata); - src/braille.o(.rodata); - src/multiboot.o(.rodata); - src/berry_fix_graphics.o(.rodata); - src/battle_controller_player_partner.o(.rodata); - src/mirage_tower.o(.rodata); - src/berry_fix_program.o(.rodata); - src/pokemon_summary_screen.o(.rodata); - src/pokedex_area_region_map.o(.rodata); - src/battle_pyramid_bag.o(.rodata); - src/pokenav.o(.rodata); - src/pokenav_main_menu.o(.rodata); - src/pokenav_list.o(.rodata); - src/pokenav_menu_handler.o(.rodata); - src/pokenav_menu_handler_gfx.o(.rodata); - src/pokenav_match_call_list.o(.rodata); - src/pokenav_match_call_gfx.o(.rodata); - src/pokenav_region_map.o(.rodata); - src/pokenav_conditions_gfx.o(.rodata); - src/pokenav_conditions_search_results.o(.rodata); - src/pokenav_ribbons_list.o(.rodata); - src/pokenav_ribbons_summary.o(.rodata); - src/pokenav_match_call_data.o(.rodata); - src/menu_specialized.o(.rodata); - src/ereader_helpers.o(.rodata); - src/faraway_island.o(.rodata); - src/ereader_screen.o(.rodata); - src/trainer_hill.o(.rodata); - src/rayquaza_scene.o(.rodata); - src/walda_phrase.o(.rodata); - src/gym_leader_rematch.o(.rodata); - src/battle_transition_frontier.o(.rodata); - src/text_input_strings.o(.rodata); - src/fonts.o(.rodata); - src/international_string_util.o(.rodata); - src/mystery_event_msg.o(.rodata); - data/mystery_gift.o(.rodata); - src/m4a_tables.o(.rodata); - data/sound_data.o(.rodata); - src/pokemon_sprite_visualizer.o(.rodata); - src/expansion_intro.o(.rodata); - } > ROM =0 - - song_data : - ALIGN(4) - { - sound/songs/midi/mus_dummy.o(.rodata); - sound/songs/midi/se_use_item.o(.rodata); - sound/songs/midi/se_pc_login.o(.rodata); - sound/songs/midi/se_pc_off.o(.rodata); - sound/songs/midi/se_pc_on.o(.rodata); - sound/songs/midi/se_select.o(.rodata); - sound/songs/se_win_open.o(.rodata); - sound/songs/se_wall_hit.o(.rodata); - sound/songs/midi/se_door.o(.rodata); - sound/songs/midi/se_exit.o(.rodata); - sound/songs/midi/se_ledge.o(.rodata); - sound/songs/midi/se_bike_bell.o(.rodata); - sound/songs/midi/se_not_effective.o(.rodata); - sound/songs/midi/se_effective.o(.rodata); - sound/songs/midi/se_super_effective.o(.rodata); - sound/songs/midi/se_ball_open.o(.rodata); - sound/songs/midi/se_faint.o(.rodata); - sound/songs/midi/se_flee.o(.rodata); - sound/songs/midi/se_sliding_door.o(.rodata); - sound/songs/midi/se_ship.o(.rodata); - sound/songs/midi/se_bang.o(.rodata); - sound/songs/midi/se_pin.o(.rodata); - sound/songs/midi/se_boo.o(.rodata); - sound/songs/midi/se_ball.o(.rodata); - sound/songs/midi/se_contest_place.o(.rodata); - sound/songs/midi/se_a.o(.rodata); - sound/songs/midi/se_i.o(.rodata); - sound/songs/midi/se_u.o(.rodata); - sound/songs/midi/se_e.o(.rodata); - sound/songs/midi/se_o.o(.rodata); - sound/songs/midi/se_n.o(.rodata); - sound/songs/midi/se_success.o(.rodata); - sound/songs/midi/se_failure.o(.rodata); - sound/songs/midi/se_exp.o(.rodata); - sound/songs/midi/se_bike_hop.o(.rodata); - sound/songs/midi/se_switch.o(.rodata); - sound/songs/midi/se_click.o(.rodata); - sound/songs/midi/se_fu_zaku.o(.rodata); - sound/songs/midi/se_contest_condition_lose.o(.rodata); - sound/songs/midi/se_lavaridge_fall_warp.o(.rodata); - sound/songs/midi/se_ice_stairs.o(.rodata); - sound/songs/midi/se_ice_break.o(.rodata); - sound/songs/midi/se_ice_crack.o(.rodata); - sound/songs/midi/se_fall.o(.rodata); - sound/songs/midi/se_unlock.o(.rodata); - sound/songs/midi/se_warp_in.o(.rodata); - sound/songs/midi/se_warp_out.o(.rodata); - sound/songs/midi/se_repel.o(.rodata); - sound/songs/midi/se_rotating_gate.o(.rodata); - sound/songs/midi/se_truck_move.o(.rodata); - sound/songs/midi/se_truck_stop.o(.rodata); - sound/songs/midi/se_truck_unload.o(.rodata); - sound/songs/midi/se_truck_door.o(.rodata); - sound/songs/midi/se_berry_blender.o(.rodata); - sound/songs/midi/se_card.o(.rodata); - sound/songs/midi/se_save.o(.rodata); - sound/songs/midi/se_ball_bounce_1.o(.rodata); - sound/songs/midi/se_ball_bounce_2.o(.rodata); - sound/songs/midi/se_ball_bounce_3.o(.rodata); - sound/songs/midi/se_ball_bounce_4.o(.rodata); - sound/songs/midi/se_ball_trade.o(.rodata); - sound/songs/midi/se_ball_throw.o(.rodata); - sound/songs/midi/se_note_c.o(.rodata); - sound/songs/midi/se_note_d.o(.rodata); - sound/songs/midi/se_note_e.o(.rodata); - sound/songs/midi/se_note_f.o(.rodata); - sound/songs/midi/se_note_g.o(.rodata); - sound/songs/midi/se_note_a.o(.rodata); - sound/songs/midi/se_note_b.o(.rodata); - sound/songs/midi/se_note_c_high.o(.rodata); - sound/songs/midi/se_puddle.o(.rodata); - sound/songs/midi/se_bridge_walk.o(.rodata); - sound/songs/midi/se_itemfinder.o(.rodata); - sound/songs/midi/se_ding_dong.o(.rodata); - sound/songs/midi/se_balloon_red.o(.rodata); - sound/songs/midi/se_balloon_blue.o(.rodata); - sound/songs/midi/se_balloon_yellow.o(.rodata); - sound/songs/midi/se_breakable_door.o(.rodata); - sound/songs/midi/se_mud_ball.o(.rodata); - sound/songs/midi/se_field_poison.o(.rodata); - sound/songs/midi/se_escalator.o(.rodata); - sound/songs/midi/se_thunderstorm.o(.rodata); - sound/songs/midi/se_thunderstorm_stop.o(.rodata); - sound/songs/midi/se_downpour.o(.rodata); - sound/songs/midi/se_downpour_stop.o(.rodata); - sound/songs/midi/se_rain.o(.rodata); - sound/songs/midi/se_rain_stop.o(.rodata); - sound/songs/midi/se_thunder.o(.rodata); - sound/songs/midi/se_thunder2.o(.rodata); - sound/songs/midi/se_elevator.o(.rodata); - sound/songs/midi/se_low_health.o(.rodata); - sound/songs/midi/se_exp_max.o(.rodata); - sound/songs/midi/se_roulette_ball.o(.rodata); - sound/songs/midi/se_roulette_ball2.o(.rodata); - sound/songs/midi/se_taillow_wing_flap.o(.rodata); - sound/songs/midi/se_shop.o(.rodata); - sound/songs/midi/se_contest_heart.o(.rodata); - sound/songs/midi/se_contest_curtain_rise.o(.rodata); - sound/songs/midi/se_contest_curtain_fall.o(.rodata); - sound/songs/midi/se_contest_icon_change.o(.rodata); - sound/songs/midi/se_contest_icon_clear.o(.rodata); - sound/songs/midi/se_contest_mons_turn.o(.rodata); - sound/songs/midi/se_shiny.o(.rodata); - sound/songs/midi/se_intro_blast.o(.rodata); - sound/songs/midi/se_mugshot.o(.rodata); - sound/songs/midi/se_applause.o(.rodata); - sound/songs/midi/se_vend.o(.rodata); - sound/songs/midi/se_orb.o(.rodata); - sound/songs/se_dex_scroll.o(.rodata); - sound/songs/se_dex_page.o(.rodata); - sound/songs/midi/se_pokenav_on.o(.rodata); - sound/songs/midi/se_pokenav_off.o(.rodata); - sound/songs/midi/se_dex_search.o(.rodata); - sound/songs/midi/se_egg_hatch.o(.rodata); - sound/songs/midi/se_ball_tray_enter.o(.rodata); - sound/songs/midi/se_ball_tray_ball.o(.rodata); - sound/songs/midi/se_ball_tray_exit.o(.rodata); - sound/songs/midi/se_glass_flute.o(.rodata); - sound/songs/se_m_thunderbolt.o(.rodata); - sound/songs/se_m_thunderbolt2.o(.rodata); - sound/songs/se_m_harden.o(.rodata); - sound/songs/se_m_nightmare.o(.rodata); - sound/songs/se_m_vital_throw.o(.rodata); - sound/songs/se_m_vital_throw2.o(.rodata); - sound/songs/se_m_bubble.o(.rodata); - sound/songs/se_m_bubble2.o(.rodata); - sound/songs/se_m_bubble3.o(.rodata); - sound/songs/se_m_rain_dance.o(.rodata); - sound/songs/midi/se_m_cut.o(.rodata); - sound/songs/se_m_string_shot.o(.rodata); - sound/songs/se_m_string_shot2.o(.rodata); - sound/songs/se_m_rock_throw.o(.rodata); - sound/songs/midi/se_m_gust.o(.rodata); - sound/songs/midi/se_m_gust2.o(.rodata); - sound/songs/midi/se_m_double_slap.o(.rodata); - sound/songs/se_m_double_team.o(.rodata); - sound/songs/midi/se_m_razor_wind.o(.rodata); - sound/songs/se_m_icy_wind.o(.rodata); - sound/songs/se_m_thunder_wave.o(.rodata); - sound/songs/midi/se_m_comet_punch.o(.rodata); - sound/songs/midi/se_m_mega_kick.o(.rodata); - sound/songs/midi/se_m_mega_kick2.o(.rodata); - sound/songs/se_m_crabhammer.o(.rodata); - sound/songs/midi/se_m_jump_kick.o(.rodata); - sound/songs/se_m_flame_wheel.o(.rodata); - sound/songs/se_m_flame_wheel2.o(.rodata); - sound/songs/se_m_flamethrower.o(.rodata); - sound/songs/midi/se_m_fire_punch.o(.rodata); - sound/songs/se_m_toxic.o(.rodata); - sound/songs/se_m_sacred_fire.o(.rodata); - sound/songs/se_m_sacred_fire2.o(.rodata); - sound/songs/se_m_ember.o(.rodata); - sound/songs/midi/se_m_take_down.o(.rodata); - sound/songs/se_m_blizzard.o(.rodata); - sound/songs/se_m_blizzard2.o(.rodata); - sound/songs/midi/se_m_scratch.o(.rodata); - sound/songs/midi/se_m_vicegrip.o(.rodata); - sound/songs/midi/se_m_wing_attack.o(.rodata); - sound/songs/midi/se_m_fly.o(.rodata); - sound/songs/midi/se_m_sand_attack.o(.rodata); - sound/songs/midi/se_m_razor_wind2.o(.rodata); - sound/songs/se_m_bite.o(.rodata); - sound/songs/midi/se_m_headbutt.o(.rodata); - sound/songs/se_m_surf.o(.rodata); - sound/songs/se_m_hydro_pump.o(.rodata); - sound/songs/se_m_whirlpool.o(.rodata); - sound/songs/midi/se_m_horn_attack.o(.rodata); - sound/songs/midi/se_m_tail_whip.o(.rodata); - sound/songs/se_m_mist.o(.rodata); - sound/songs/se_m_poison_powder.o(.rodata); - sound/songs/midi/se_m_bind.o(.rodata); - sound/songs/se_m_dragon_rage.o(.rodata); - sound/songs/se_m_sing.o(.rodata); - sound/songs/se_m_perish_song.o(.rodata); - sound/songs/midi/se_m_pay_day.o(.rodata); - sound/songs/se_m_dig.o(.rodata); - sound/songs/se_m_dizzy_punch.o(.rodata); - sound/songs/se_m_self_destruct.o(.rodata); - sound/songs/se_m_explosion.o(.rodata); - sound/songs/se_m_absorb_2.o(.rodata); - sound/songs/se_m_absorb.o(.rodata); - sound/songs/se_m_screech.o(.rodata); - sound/songs/se_m_bubble_beam.o(.rodata); - sound/songs/se_m_bubble_beam2.o(.rodata); - sound/songs/se_m_supersonic.o(.rodata); - sound/songs/se_m_belly_drum.o(.rodata); - sound/songs/se_m_metronome.o(.rodata); - sound/songs/se_m_bonemerang.o(.rodata); - sound/songs/se_m_lick.o(.rodata); - sound/songs/se_m_psybeam.o(.rodata); - sound/songs/se_m_faint_attack.o(.rodata); - sound/songs/midi/se_m_swords_dance.o(.rodata); - sound/songs/midi/se_m_leer.o(.rodata); - sound/songs/se_m_swagger.o(.rodata); - sound/songs/se_m_swagger2.o(.rodata); - sound/songs/se_m_heal_bell.o(.rodata); - sound/songs/se_m_confuse_ray.o(.rodata); - sound/songs/se_m_snore.o(.rodata); - sound/songs/se_m_brick_break.o(.rodata); - sound/songs/se_m_giga_drain.o(.rodata); - sound/songs/se_m_psybeam2.o(.rodata); - sound/songs/se_m_solar_beam.o(.rodata); - sound/songs/se_m_petal_dance.o(.rodata); - sound/songs/se_m_teleport.o(.rodata); - sound/songs/se_m_minimize.o(.rodata); - sound/songs/se_m_sketch.o(.rodata); - sound/songs/se_m_swift.o(.rodata); - sound/songs/se_m_reflect.o(.rodata); - sound/songs/se_m_barrier.o(.rodata); - sound/songs/se_m_detect.o(.rodata); - sound/songs/se_m_lock_on.o(.rodata); - sound/songs/se_m_moonlight.o(.rodata); - sound/songs/se_m_charm.o(.rodata); - sound/songs/se_m_charge.o(.rodata); - sound/songs/se_m_strength.o(.rodata); - sound/songs/se_m_hyper_beam.o(.rodata); - sound/songs/se_m_waterfall.o(.rodata); - sound/songs/se_m_reversal.o(.rodata); - sound/songs/se_m_acid_armor.o(.rodata); - sound/songs/se_m_sandstorm.o(.rodata); - sound/songs/se_m_tri_attack.o(.rodata); - sound/songs/se_m_tri_attack2.o(.rodata); - sound/songs/se_m_encore.o(.rodata); - sound/songs/se_m_encore2.o(.rodata); - sound/songs/se_m_baton_pass.o(.rodata); - sound/songs/se_m_milk_drink.o(.rodata); - sound/songs/se_m_attract.o(.rodata); - sound/songs/se_m_attract2.o(.rodata); - sound/songs/se_m_morning_sun.o(.rodata); - sound/songs/se_m_flatter.o(.rodata); - sound/songs/se_m_sand_tomb.o(.rodata); - sound/songs/se_m_grasswhistle.o(.rodata); - sound/songs/se_m_spit_up.o(.rodata); - sound/songs/se_m_dive.o(.rodata); - sound/songs/se_m_earthquake.o(.rodata); - sound/songs/se_m_twister.o(.rodata); - sound/songs/se_m_sweet_scent.o(.rodata); - sound/songs/se_m_yawn.o(.rodata); - sound/songs/se_m_sky_uppercut.o(.rodata); - sound/songs/se_m_stat_increase.o(.rodata); - sound/songs/se_m_heat_wave.o(.rodata); - sound/songs/se_m_uproar.o(.rodata); - sound/songs/se_m_hail.o(.rodata); - sound/songs/se_m_cosmic_power.o(.rodata); - sound/songs/se_m_teeter_dance.o(.rodata); - sound/songs/se_m_stat_decrease.o(.rodata); - sound/songs/se_m_haze.o(.rodata); - sound/songs/se_m_hyper_beam2.o(.rodata); - sound/songs/midi/se_rg_door.o(.rodata); - sound/songs/midi/se_rg_card_flip.o(.rodata); - sound/songs/midi/se_rg_card_flipping.o(.rodata); - sound/songs/midi/se_rg_card_open.o(.rodata); - sound/songs/midi/se_rg_bag_cursor.o(.rodata); - sound/songs/midi/se_rg_bag_pocket.o(.rodata); - sound/songs/midi/se_rg_ball_click.o(.rodata); - sound/songs/midi/se_rg_shop.o(.rodata); - sound/songs/midi/se_rg_ss_anne_horn.o(.rodata); - sound/songs/midi/se_rg_help_open.o(.rodata); - sound/songs/midi/se_rg_help_close.o(.rodata); - sound/songs/midi/se_rg_help_error.o(.rodata); - sound/songs/midi/se_rg_deoxys_move.o(.rodata); - sound/songs/midi/se_rg_poke_jump_success.o(.rodata); - sound/songs/midi/se_rg_poke_jump_failure.o(.rodata); - sound/songs/midi/se_pokenav_call.o(.rodata); - sound/songs/midi/se_pokenav_hang_up.o(.rodata); - sound/songs/midi/se_arena_timeup1.o(.rodata); - sound/songs/midi/se_arena_timeup2.o(.rodata); - sound/songs/midi/se_pike_curtain_close.o(.rodata); - sound/songs/midi/se_pike_curtain_open.o(.rodata); - sound/songs/midi/se_sudowoodo_shake.o(.rodata); - sound/songs/midi/mus_littleroot_test.o(.rodata); - sound/songs/midi/mus_gsc_route38.o(.rodata); - sound/songs/midi/mus_caught.o(.rodata); - sound/songs/midi/mus_victory_wild.o(.rodata); - sound/songs/midi/mus_victory_gym_leader.o(.rodata); - sound/songs/midi/mus_victory_league.o(.rodata); - sound/songs/midi/mus_c_comm_center.o(.rodata); - sound/songs/midi/mus_gsc_pewter.o(.rodata); - sound/songs/midi/mus_c_vs_legend_beast.o(.rodata); - sound/songs/midi/mus_route101.o(.rodata); - sound/songs/midi/mus_route110.o(.rodata); - sound/songs/midi/mus_route120.o(.rodata); - sound/songs/midi/mus_petalburg.o(.rodata); - sound/songs/midi/mus_oldale.o(.rodata); - sound/songs/midi/mus_gym.o(.rodata); - sound/songs/midi/mus_surf.o(.rodata); - sound/songs/midi/mus_petalburg_woods.o(.rodata); - sound/songs/midi/mus_level_up.o(.rodata); - sound/songs/midi/mus_heal.o(.rodata); - sound/songs/midi/mus_obtain_badge.o(.rodata); - sound/songs/midi/mus_obtain_item.o(.rodata); - sound/songs/midi/mus_evolved.o(.rodata); - sound/songs/midi/mus_obtain_tmhm.o(.rodata); - sound/songs/midi/mus_lilycove_museum.o(.rodata); - sound/songs/midi/mus_route122.o(.rodata); - sound/songs/midi/mus_oceanic_museum.o(.rodata); - sound/songs/midi/mus_evolution_intro.o(.rodata); - sound/songs/midi/mus_evolution.o(.rodata); - sound/songs/midi/mus_move_deleted.o(.rodata); - sound/songs/midi/mus_encounter_girl.o(.rodata); - sound/songs/midi/mus_encounter_male.o(.rodata); - sound/songs/midi/mus_abandoned_ship.o(.rodata); - sound/songs/midi/mus_fortree.o(.rodata); - sound/songs/midi/mus_birch_lab.o(.rodata); - sound/songs/midi/mus_b_tower_rs.o(.rodata); - sound/songs/midi/mus_encounter_swimmer.o(.rodata); - sound/songs/midi/mus_cave_of_origin.o(.rodata); - sound/songs/midi/mus_obtain_berry.o(.rodata); - sound/songs/midi/mus_awaken_legend.o(.rodata); - sound/songs/midi/mus_slots_jackpot.o(.rodata); - sound/songs/midi/mus_slots_win.o(.rodata); - sound/songs/midi/mus_too_bad.o(.rodata); - sound/songs/midi/mus_roulette.o(.rodata); - sound/songs/midi/mus_link_contest_p1.o(.rodata); - sound/songs/midi/mus_link_contest_p2.o(.rodata); - sound/songs/midi/mus_link_contest_p3.o(.rodata); - sound/songs/midi/mus_link_contest_p4.o(.rodata); - sound/songs/midi/mus_encounter_rich.o(.rodata); - sound/songs/midi/mus_verdanturf.o(.rodata); - sound/songs/midi/mus_rustboro.o(.rodata); - sound/songs/midi/mus_poke_center.o(.rodata); - sound/songs/midi/mus_route104.o(.rodata); - sound/songs/midi/mus_route119.o(.rodata); - sound/songs/midi/mus_cycling.o(.rodata); - sound/songs/midi/mus_poke_mart.o(.rodata); - sound/songs/midi/mus_littleroot.o(.rodata); - sound/songs/midi/mus_mt_chimney.o(.rodata); - sound/songs/midi/mus_encounter_female.o(.rodata); - sound/songs/midi/mus_lilycove.o(.rodata); - sound/songs/midi/mus_route111.o(.rodata); - sound/songs/midi/mus_help.o(.rodata); - sound/songs/midi/mus_underwater.o(.rodata); - sound/songs/midi/mus_victory_trainer.o(.rodata); - sound/songs/midi/mus_title.o(.rodata); - sound/songs/midi/mus_intro.o(.rodata); - sound/songs/midi/mus_encounter_may.o(.rodata); - sound/songs/midi/mus_encounter_intense.o(.rodata); - sound/songs/midi/mus_encounter_cool.o(.rodata); - sound/songs/midi/mus_route113.o(.rodata); - sound/songs/midi/mus_encounter_aqua.o(.rodata); - sound/songs/midi/mus_follow_me.o(.rodata); - sound/songs/midi/mus_encounter_brendan.o(.rodata); - sound/songs/midi/mus_ever_grande.o(.rodata); - sound/songs/midi/mus_encounter_suspicious.o(.rodata); - sound/songs/midi/mus_victory_aqua_magma.o(.rodata); - sound/songs/midi/mus_cable_car.o(.rodata); - sound/songs/midi/mus_game_corner.o(.rodata); - sound/songs/midi/mus_dewford.o(.rodata); - sound/songs/midi/mus_safari_zone.o(.rodata); - sound/songs/midi/mus_victory_road.o(.rodata); - sound/songs/midi/mus_aqua_magma_hideout.o(.rodata); - sound/songs/midi/mus_sailing.o(.rodata); - sound/songs/midi/mus_mt_pyre.o(.rodata); - sound/songs/midi/mus_slateport.o(.rodata); - sound/songs/midi/mus_mt_pyre_exterior.o(.rodata); - sound/songs/midi/mus_school.o(.rodata); - sound/songs/midi/mus_hall_of_fame.o(.rodata); - sound/songs/midi/mus_fallarbor.o(.rodata); - sound/songs/midi/mus_sealed_chamber.o(.rodata); - sound/songs/midi/mus_contest_winner.o(.rodata); - sound/songs/midi/mus_contest.o(.rodata); - sound/songs/midi/mus_encounter_magma.o(.rodata); - sound/songs/midi/mus_intro_battle.o(.rodata); - sound/songs/midi/mus_abnormal_weather.o(.rodata); - sound/songs/midi/mus_weather_groudon.o(.rodata); - sound/songs/midi/mus_sootopolis.o(.rodata); - sound/songs/midi/mus_contest_results.o(.rodata); - sound/songs/midi/mus_hall_of_fame_room.o(.rodata); - sound/songs/midi/mus_trick_house.o(.rodata); - sound/songs/midi/mus_encounter_twins.o(.rodata); - sound/songs/midi/mus_encounter_elite_four.o(.rodata); - sound/songs/midi/mus_encounter_hiker.o(.rodata); - sound/songs/midi/mus_contest_lobby.o(.rodata); - sound/songs/midi/mus_encounter_interviewer.o(.rodata); - sound/songs/midi/mus_encounter_champion.o(.rodata); - sound/songs/midi/mus_credits.o(.rodata); - sound/songs/midi/mus_end.o(.rodata); - sound/songs/midi/mus_b_frontier.o(.rodata); - sound/songs/midi/mus_b_arena.o(.rodata); - sound/songs/midi/mus_obtain_b_points.o(.rodata); - sound/songs/midi/mus_register_match_call.o(.rodata); - sound/songs/midi/mus_b_pyramid.o(.rodata); - sound/songs/midi/mus_b_pyramid_top.o(.rodata); - sound/songs/midi/mus_b_palace.o(.rodata); - sound/songs/midi/mus_rayquaza_appears.o(.rodata); - sound/songs/midi/mus_b_tower.o(.rodata); - sound/songs/midi/mus_obtain_symbol.o(.rodata); - sound/songs/midi/mus_b_dome.o(.rodata); - sound/songs/midi/mus_b_pike.o(.rodata); - sound/songs/midi/mus_b_factory.o(.rodata); - sound/songs/midi/mus_vs_rayquaza.o(.rodata); - sound/songs/midi/mus_vs_frontier_brain.o(.rodata); - sound/songs/midi/mus_vs_mew.o(.rodata); - sound/songs/midi/mus_b_dome_lobby.o(.rodata); - sound/songs/midi/mus_vs_wild.o(.rodata); - sound/songs/midi/mus_vs_aqua_magma.o(.rodata); - sound/songs/midi/mus_vs_trainer.o(.rodata); - sound/songs/midi/mus_vs_gym_leader.o(.rodata); - sound/songs/midi/mus_vs_champion.o(.rodata); - sound/songs/midi/mus_vs_regi.o(.rodata); - sound/songs/midi/mus_vs_kyogre_groudon.o(.rodata); - sound/songs/midi/mus_vs_rival.o(.rodata); - sound/songs/midi/mus_vs_elite_four.o(.rodata); - sound/songs/midi/mus_vs_aqua_magma_leader.o(.rodata); - sound/songs/midi/mus_rg_follow_me.o(.rodata); - sound/songs/midi/mus_rg_game_corner.o(.rodata); - sound/songs/midi/mus_rg_rocket_hideout.o(.rodata); - sound/songs/midi/mus_rg_gym.o(.rodata); - sound/songs/midi/mus_rg_jigglypuff.o(.rodata); - sound/songs/midi/mus_rg_intro_fight.o(.rodata); - sound/songs/midi/mus_rg_title.o(.rodata); - sound/songs/midi/mus_rg_cinnabar.o(.rodata); - sound/songs/midi/mus_rg_lavender.o(.rodata); - sound/songs/midi/mus_rg_heal.o(.rodata); - sound/songs/midi/mus_rg_cycling.o(.rodata); - sound/songs/midi/mus_rg_encounter_rocket.o(.rodata); - sound/songs/midi/mus_rg_encounter_girl.o(.rodata); - sound/songs/midi/mus_rg_encounter_boy.o(.rodata); - sound/songs/midi/mus_rg_hall_of_fame.o(.rodata); - sound/songs/midi/mus_rg_viridian_forest.o(.rodata); - sound/songs/midi/mus_rg_mt_moon.o(.rodata); - sound/songs/midi/mus_rg_poke_mansion.o(.rodata); - sound/songs/midi/mus_rg_credits.o(.rodata); - sound/songs/midi/mus_rg_route1.o(.rodata); - sound/songs/midi/mus_rg_route24.o(.rodata); - sound/songs/midi/mus_rg_route3.o(.rodata); - sound/songs/midi/mus_rg_route11.o(.rodata); - sound/songs/midi/mus_rg_victory_road.o(.rodata); - sound/songs/midi/mus_rg_vs_gym_leader.o(.rodata); - sound/songs/midi/mus_rg_vs_trainer.o(.rodata); - sound/songs/midi/mus_rg_vs_wild.o(.rodata); - sound/songs/midi/mus_rg_vs_champion.o(.rodata); - sound/songs/midi/mus_rg_pallet.o(.rodata); - sound/songs/midi/mus_rg_oak_lab.o(.rodata); - sound/songs/midi/mus_rg_oak.o(.rodata); - sound/songs/midi/mus_rg_poke_center.o(.rodata); - sound/songs/midi/mus_rg_ss_anne.o(.rodata); - sound/songs/midi/mus_rg_surf.o(.rodata); - sound/songs/midi/mus_rg_poke_tower.o(.rodata); - sound/songs/midi/mus_rg_silph.o(.rodata); - sound/songs/midi/mus_rg_fuchsia.o(.rodata); - sound/songs/midi/mus_rg_celadon.o(.rodata); - sound/songs/midi/mus_rg_victory_trainer.o(.rodata); - sound/songs/midi/mus_rg_victory_wild.o(.rodata); - sound/songs/midi/mus_rg_victory_gym_leader.o(.rodata); - sound/songs/midi/mus_rg_vermillion.o(.rodata); - sound/songs/midi/mus_rg_pewter.o(.rodata); - sound/songs/midi/mus_rg_encounter_rival.o(.rodata); - sound/songs/midi/mus_rg_rival_exit.o(.rodata); - sound/songs/midi/mus_rg_dex_rating.o(.rodata); - sound/songs/midi/mus_rg_obtain_key_item.o(.rodata); - sound/songs/midi/mus_rg_caught_intro.o(.rodata); - sound/songs/midi/mus_rg_photo.o(.rodata); - sound/songs/midi/mus_rg_game_freak.o(.rodata); - sound/songs/midi/mus_rg_caught.o(.rodata); - sound/songs/midi/mus_rg_new_game_instruct.o(.rodata); - sound/songs/midi/mus_rg_new_game_intro.o(.rodata); - sound/songs/midi/mus_rg_new_game_exit.o(.rodata); - sound/songs/midi/mus_rg_poke_jump.o(.rodata); - sound/songs/midi/mus_rg_union_room.o(.rodata); - sound/songs/midi/mus_rg_net_center.o(.rodata); - sound/songs/midi/mus_rg_mystery_gift.o(.rodata); - sound/songs/midi/mus_rg_berry_pick.o(.rodata); - sound/songs/midi/mus_rg_sevii_cave.o(.rodata); - sound/songs/midi/mus_rg_teachy_tv_show.o(.rodata); - sound/songs/midi/mus_rg_sevii_route.o(.rodata); - sound/songs/midi/mus_rg_sevii_dungeon.o(.rodata); - sound/songs/midi/mus_rg_sevii_123.o(.rodata); - sound/songs/midi/mus_rg_sevii_45.o(.rodata); - sound/songs/midi/mus_rg_sevii_67.o(.rodata); - sound/songs/midi/mus_rg_poke_flute.o(.rodata); - sound/songs/midi/mus_rg_vs_deoxys.o(.rodata); - sound/songs/midi/mus_rg_vs_mewtwo.o(.rodata); - sound/songs/midi/mus_rg_vs_legend.o(.rodata); - sound/songs/midi/mus_rg_encounter_gym_leader.o(.rodata); - sound/songs/midi/mus_rg_encounter_deoxys.o(.rodata); - sound/songs/midi/mus_rg_trainer_tower.o(.rodata); - sound/songs/midi/mus_rg_slow_pallet.o(.rodata); - sound/songs/midi/mus_rg_teachy_tv_menu.o(.rodata); - sound/songs/midi/ph_trap_blend.o(.rodata); - sound/songs/midi/ph_trap_held.o(.rodata); - sound/songs/midi/ph_trap_solo.o(.rodata); - sound/songs/midi/ph_face_blend.o(.rodata); - sound/songs/midi/ph_face_held.o(.rodata); - sound/songs/midi/ph_face_solo.o(.rodata); - sound/songs/midi/ph_cloth_blend.o(.rodata); - sound/songs/midi/ph_cloth_held.o(.rodata); - sound/songs/midi/ph_cloth_solo.o(.rodata); - sound/songs/midi/ph_dress_blend.o(.rodata); - sound/songs/midi/ph_dress_held.o(.rodata); - sound/songs/midi/ph_dress_solo.o(.rodata); - sound/songs/midi/ph_fleece_blend.o(.rodata); - sound/songs/midi/ph_fleece_held.o(.rodata); - sound/songs/midi/ph_fleece_solo.o(.rodata); - sound/songs/midi/ph_kit_blend.o(.rodata); - sound/songs/midi/ph_kit_held.o(.rodata); - sound/songs/midi/ph_kit_solo.o(.rodata); - sound/songs/midi/ph_price_blend.o(.rodata); - sound/songs/midi/ph_price_held.o(.rodata); - sound/songs/midi/ph_price_solo.o(.rodata); - sound/songs/midi/ph_lot_blend.o(.rodata); - sound/songs/midi/ph_lot_held.o(.rodata); - sound/songs/midi/ph_lot_solo.o(.rodata); - sound/songs/midi/ph_goat_blend.o(.rodata); - sound/songs/midi/ph_goat_held.o(.rodata); - sound/songs/midi/ph_goat_solo.o(.rodata); - sound/songs/midi/ph_thought_blend.o(.rodata); - sound/songs/midi/ph_thought_held.o(.rodata); - sound/songs/midi/ph_thought_solo.o(.rodata); - sound/songs/midi/ph_choice_blend.o(.rodata); - sound/songs/midi/ph_choice_held.o(.rodata); - sound/songs/midi/ph_choice_solo.o(.rodata); - sound/songs/midi/ph_mouth_blend.o(.rodata); - sound/songs/midi/ph_mouth_held.o(.rodata); - sound/songs/midi/ph_mouth_solo.o(.rodata); - sound/songs/midi/ph_foot_blend.o(.rodata); - sound/songs/midi/ph_foot_held.o(.rodata); - sound/songs/midi/ph_foot_solo.o(.rodata); - sound/songs/midi/ph_goose_blend.o(.rodata); - sound/songs/midi/ph_goose_held.o(.rodata); - sound/songs/midi/ph_goose_solo.o(.rodata); - sound/songs/midi/ph_strut_blend.o(.rodata); - sound/songs/midi/ph_strut_held.o(.rodata); - sound/songs/midi/ph_strut_solo.o(.rodata); - sound/songs/midi/ph_cure_blend.o(.rodata); - sound/songs/midi/ph_cure_held.o(.rodata); - sound/songs/midi/ph_cure_solo.o(.rodata); - sound/songs/midi/ph_nurse_blend.o(.rodata); - sound/songs/midi/ph_nurse_held.o(.rodata); - sound/songs/midi/ph_nurse_solo.o(.rodata); - } > ROM =0 - - lib_rodata : - SUBALIGN(4) - { - src/m4a.o(.rodata); - src/agb_flash.o(.rodata); - src/agb_flash_1m.o(.rodata); - src/agb_flash_mx.o(.rodata); - src/agb_flash_le.o(.rodata); - src/siirtc.o(.rodata); - src/librfu_rfu.o(.rodata); - src/librfu_sio32id.o(.rodata); - *libgcc.a:_divdi3.o(.rodata); - *libgcc.a:_udivdi3.o(.rodata); - *libc.a:memcpy.o(.rodata); - *libc.a:memset.o(.rodata); - *libc.a:strcmp.o(.rodata); - *libc.a:strcpy.o(.rodata); - *libc.a:impure.o(.rodata); - *libc.a:vsprintf.o(.rodata); - *libc.a:vfprintf.o(.rodata); - *libc.a:wsetup.o(.rodata); - *libc.a:dtoa.o(.rodata); - *libc.a:fflush.o(.rodata); - *libc.a:findfp.o(.rodata); - *libc.a:freer.o(.rodata); - *libc.a:mtrim.o(.rodata); - *libc.a:fvwrite.o(.rodata); - *libc.a:fwalk.o(.rodata); - *libc.a:locale.o(.rodata); - *libc.a:makebuf.o(.rodata); - *libc.a:mallocr.o(.rodata); - *libc.a:mbtowc_r.o(.rodata); - *libc.a:memchr.o(.rodata); - *libc.a:memmove.o(.rodata); - *libc.a:mlock.o(.rodata); - *libc.a:mprec.o(.rodata); - *libc.a:s_isinf.o(.rodata); - *libc.a:s_isnan.o(.rodata); - *libc.a:sbrkr.o(.rodata); - *libc.a:stdio.o(.rodata); - *libc.a:strlen.o(.rodata); - *libc.a:syscalls.o(.rodata); - *libc.a:writer.o(.rodata); - *libc.a:callocr.o(.rodata); - *libc.a:closer.o(.rodata); - *libc.a:errno.o(.rodata); - *libc.a:fstatr.o(.rodata); - *libc.a:libcfunc.o(.rodata); - *libc.a:lseekr.o(.rodata); - *libc.a:readr.o(.rodata); - src/libisagbprn.o(.rodata); - } > ROM =0 - - multiboot_data : - ALIGN(4) - { - data/multiboot_ereader.o(.rodata); - data/multiboot_berry_glitch_fix.o(.rodata); - data/multiboot_pokemon_colosseum.o(.rodata); - } > ROM =0 - - gfx_data : - ALIGN(4) - { - src/graphics.o(.rodata); - } > ROM =0 - - extra : - ALIGN(4) - { - src/*.o(.text); - gflib/*.o(.text); - src/*.o(.rodata); - gflib/*.o(.rodata); - data/*.o(.rodata); - } > ROM = 0 - - .data.iwram : - ALIGN(4) - { - __iwram_lma = .; - . = . + (__iwram_end - __iwram_start); - } > ROM = 0 - - .data.ewram : - ALIGN(4) - { - __ewram_lma = .; - . = . + (__ewram_end - __ewram_start); - } > ROM = 0 - - __rom_end = .; - - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - - /* Discard everything not specifically mentioned above. */ - /DISCARD/ : - { - *(*); - } -} diff --git a/sym_bss.txt b/sym_bss.txt deleted file mode 100644 index 3a23e74789..0000000000 --- a/sym_bss.txt +++ /dev/null @@ -1,63 +0,0 @@ - .include "src/main.o" - .include "gflib/malloc.o" - .include "gflib/dma3_manager.o" - .include "gflib/gpu_regs.o" - .include "gflib/bg.o" - .include "gflib/text.o" - .include "gflib/sprite.o" - .include "src/link.o" - .include "src/AgbRfu_LinkManager.o" - .include "src/link_rfu_3.o" - .include "src/link_rfu_2.o" - .include "src/union_room.o" - .include "src/wireless_communication_status_screen.o" - .include "src/union_room_battle.o" - .include "src/dodrio_berry_picking.o" - .include "src/rtc.o" - .include "src/main_menu.o" - .include "src/digit_obj_util.o" - .include "src/egg_hatch.o" - .include "src/berry_blender.o" - .include "src/play_time.o" - .include "src/overworld.o" - .include "src/field_camera.o" - .include "src/script.o" - .include "src/scrcmd.o" - .include "src/tileset_anims.o" - .include "src/palette.o" - .include "src/sound.o" - .include "src/field_weather.o" - .include "src/field_effect.o" - .include "src/pokemon_storage_system.o" - .include "src/fldeff_cut.o" - .include "src/script_menu.o" - .include "src/record_mixing.o" - .include "src/tv.o" - .include "src/mauville_old_man.o" - .include "src/menu_helpers.o" - .include "src/region_map.o" - .include "src/slot_machine.o" - .include "src/contest_painting.o" - .include "src/starter_choose.o" - .include "src/pokedex_area_screen.o" - .include "src/battle_transition.o" - .include "src/pokemon_animation.o" - .include "src/recorded_battle.o" - .include "src/battle_factory_screen.o" - .include "src/battle_factory.o" - .include "src/battle_pike.o" - .include "src/battle_tent.o" - .include "src/multiboot.o" - .include "src/mirage_tower.o" - .include "src/berry_fix_program.o" - .include "src/pokenav_conditions_gfx.o" - .include "src/pokenav_ribbons_summary.o" - .include "src/ereader_helpers.o" - .include "src/faraway_island.o" - .include "src/m4a_1.o" - .include "data/sound_data.o" - .include "src/agb_flash.o" - .include "src/siirtc.o" - .include "*libgcc.a:dp-bit.o" - .include "*libgcc.a:fp-bit.o" - .include "*libc.a:syscalls.o" diff --git a/sym_common.txt b/sym_common.txt deleted file mode 100644 index 170aee2f42..0000000000 --- a/sym_common.txt +++ /dev/null @@ -1,83 +0,0 @@ - .space 0x8 - .include "main.o" - @ ../gflib/bg.o - .align 2 -gWindowTileAutoAllocEnabled: - .space 4 - @ ../gflib/window.o - .align 4 -gTransparentTileNumber: - .space 1 - .align 4 -gWindowBgTilemapBuffers: - .space 16 - @ ../gflib/text.o - .align 4 -gFonts: - .space 4 - .align 2 -gDisableTextPrinters: - .space 1 - .align 4 -gCurGlyph: - .space 132 - .align 2 -gTextFlags: - .space 4 - @ ../gflib/sprite.o - .align 2 -gOamMatrixAllocBitmap: - .space 4 - .align 2 -gReservedSpritePaletteCount: - .space 1 - .align 4 - .include "link.o" - .include "AgbRfu_LinkManager.o" - .include "link_rfu_2.o" - .include "rtc.o" - .include "battle_main.o" - .include "battle_controllers.o" - .include "random.o" - .include "load_save.o" - .include "berry_blender.o" - .include "overworld.o" - .include "fieldmap.o" - .include "field_camera.o" - .include "field_control_avatar.o" - .include "start_menu.o" - .include "sound.o" - .include "task.o" - .include "trainer_see.o" - .include "pokedex.o" - .include "contest.o" - .include "tv.o" - .include "mauville_old_man.o" - .include "image_processing_effects.o" - - .space 0x4 - - .include "contest_painting.o" - .include "field_specials.o" - .include "evolution_scene.o" - .include "pokedex_cry_screen.o" - .include "save.o" - .include "battle_tower.o" - .include "intro.o" - .include "battle_anim_throw.o" - .include "battle_factory_screen.o" - .include "apprentice.o" - - .space 0x8 - - .include "list_menu.o" - .include "party_menu.o" - - .space 0x44 - - .include "ereader_screen.o" - .include "m4a.o" - .include "agb_flash.o" - .include "librfu_stwi.o" - .include "librfu_rfu.o" - .include "librfu_sio32id.o" diff --git a/sym_ewram.txt b/sym_ewram.txt deleted file mode 100644 index 3123b3388a..0000000000 --- a/sym_ewram.txt +++ /dev/null @@ -1,154 +0,0 @@ - .include "gflib/malloc.o" - .include "src/decompress.o" - .include "src/main.o" - .include "gflib/window.o" - .include "gflib/text.o" - .include "gflib/sprite.o" - .include "gflib/string_util.o" - .include "src/link.o" - .include "src/AgbRfu_LinkManager.o" - .include "src/link_rfu_3.o" - .include "src/link_rfu_2.o" - .include "src/union_room.o" - .include "src/mystery_gift_menu.o" - .include "src/union_room_player_avatar.o" - .include "src/wireless_communication_status_screen.o" - .include "src/union_room_battle.o" - .include "src/mystery_gift.o" - .include "src/mystery_gift_view.o" - .include "src/mystery_gift_server.o" - .include "src/mystery_gift_client.o" - .include "src/union_room_chat.o" - .include "src/berry_crush.o" - .include "src/berry_powder.o" - .include "src/dodrio_berry_picking.o" - .include "src/pokemon_jump.o" - .include "src/main_menu.o" - .include "src/battle_controllers.o" - .include "src/digit_obj_util.o" - .include "src/battle_main.o" - .include "src/pokemon.o" - .include "src/random.o" - .include "src/daycare.o" - .include "src/load_save.o" - .include "src/trade.o" - .include "src/berry_blender.o" - .include "src/new_game.o" - .include "src/overworld.o" - .include "src/fieldmap.o" - .include "src/field_camera.o" - .include "src/field_player_avatar.o" - .include "src/event_object_movement.o" - .include "src/field_message_box.o" - .include "src/scrcmd.o" - .include "src/field_control_avatar.o" - .include "src/event_data.o" - .include "src/start_menu.o" - .include "src/tileset_anims.o" - .include "src/palette.o" - .include "src/sound.o" - .include "src/battle_anim.o" - .include "src/battle_anim_mons.o" - - .space 0xC - .include "src/field_weather.o" - .include "src/field_weather_effect.o" - .include "src/battle_setup.o" - .include "src/trainer_see.o" - .include "src/wild_encounter.o" - .include "src/field_effect.o" - .include "src/scanline_effect.o" - .include "src/option_menu.o" - .include "src/pokedex.o" - .include "src/trainer_card.o" - .include "src/frontier_pass.o" - .include "src/pokemon_storage_system.o" - .include "src/script_movement.o" - .include "src/fldeff_cut.o" - .include "src/map_name_popup.o" - .include "src/item.o" - .include "src/contest.o" - .include "src/shop.o" - .include "src/fldeff_escalator.o" - .include "src/script_menu.o" - .include "src/naming_screen.o" - .include "src/money.o" - .include "src/record_mixing.o" - .include "src/secret_base.o" - .include "src/tv.o" - .include "src/contest_util.o" - .include "src/rotating_gate.o" - .include "src/safari_zone.o" - .include "src/item_use.o" - .include "src/battle_anim_effects_1.o" - .include "src/battle_anim_dragon.o" - .include "src/battle_anim_utility_funcs.o" - .include "src/battle_intro.o" - .include "src/easy_chat.o" - .include "src/mon_markings.o" - .include "src/mauville_old_man.o" - .include "src/mail.o" - .include "src/menu_helpers.o" - .include "src/region_map.o" - .include "src/decoration.o" - .include "src/slot_machine.o" - .include "src/battle_ai_main.o" - .include "src/fldeff_misc.o" - .include "src/pokeblock.o" - .include "src/field_specials.o" - .include "src/battle_records.o" - .include "src/pokedex_area_screen.o" - .include "src/evolution_scene.o" - .include "src/roulette.o" - .include "src/pokedex_cry_screen.o" - .include "src/coins.o" - .include "src/battle_transition.o" - .include "src/battle_message.o" - .include "src/cable_car.o" - .include "src/confetti_util.o" - .include "src/save.o" - .include "src/mystery_event_script.o" - .include "src/move_relearner.o" - .include "src/decoration_inventory.o" - .include "src/roamer.o" - .include "src/battle_tower.o" - .include "src/use_pokeblock.o" - .include "src/player_pc.o" - .include "src/intro.o" - .include "src/field_region_map.o" - .include "src/hall_of_fame.o" - .include "src/credits.o" - .include "src/lottery_corner.o" - .include "src/diploma.o" - .include "src/berry_tag_screen.o" - .include "src/mystery_event_menu.o" - .include "src/save_failed_screen.o" - .include "src/braille_puzzles.o" - .include "src/pokeblock_feed.o" - .include "src/intro_credits_graphics.o" - .include "src/recorded_battle.o" - .include "src/trainer_pokemon_sprites.o" - .include "src/lilycove_lady.o" - .include "src/battle_dome.o" - .include "src/match_call.o" - .include "src/menu.o" - .include "src/battle_factory_screen.o" - .include "src/rotating_tile_puzzle.o" - .include "src/item_menu.o" - .include "src/list_menu.o" - .include "src/dynamic_placeholder_text_util.o" - .include "src/item_icon.o" - .include "src/party_menu.o" - .include "src/mirage_tower.o" - .include "src/pokemon_summary_screen.o" - .include "src/pokedex_area_region_map.o" - .include "src/battle_pyramid_bag.o" - .include "src/pokenav.o" - .include "src/pokenav_list.o" - .include "src/menu_specialized.o" - .include "src/faraway_island.o" - .include "src/trainer_hill.o" - .include "src/rayquaza_scene.o" - .include "src/debug.o" - .include "src/battle_controller_player.o" - .include "src/pokedex_plus_hgss.o" From 863b96f75964ccc35ee6545e48652ecd9872cec7 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 12 Aug 2024 01:05:38 +0200 Subject: [PATCH 074/225] Fixes Stomping Tantrum effect not doubling power in certain situations (#5140) * Fixes Stomping Tantrum effect not doubling power in certain situations * fix dancer test --- src/battle_script_commands.c | 14 +-- test/battle/move_effect/stomping_tantrum.c | 134 +++++++++++++++++++++ 2 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 test/battle/move_effect/stomping_tantrum.c diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 317613c479..8056b3ddf2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1364,9 +1364,8 @@ static void Cmd_attackcanceler(void) } // Z-moves and Max Moves bypass protection, but deal reduced damage (factored in AccumulateOtherModifiers) - if ((IsZMove(gCurrentMove) - || IsMaxMove(gCurrentMove)) - && IS_BATTLER_PROTECTED(gBattlerTarget)) + if ((IsZMove(gCurrentMove) || IsMaxMove(gCurrentMove)) + && IS_BATTLER_PROTECTED(gBattlerTarget)) { BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_CouldntFullyProtect; @@ -5825,7 +5824,9 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_UPDATE_LAST_MOVES: - if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) + if ((gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) + || (gBattleMons[gBattlerAttacker].status2 & (STATUS2_FLINCHED)) + || gProtectStructs[gBattlerAttacker].prlzImmobility) gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; else gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); @@ -6267,9 +6268,8 @@ static void Cmd_moveend(void) } } - if (!(gBattleStruct->lastMoveFailed & gBitTable[gBattlerAttacker] - || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove - && gBattleStruct->bouncedMoveIsUsed))) + if (!(gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) + || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) { // 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) diff --git a/test/battle/move_effect/stomping_tantrum.c b/test/battle/move_effect/stomping_tantrum.c new file mode 100644 index 0000000000..1a5870fdd0 --- /dev/null +++ b/test/battle/move_effect/stomping_tantrum.c @@ -0,0 +1,134 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_STOMPING_TANTRUM].effect == EFFECT_STOMPING_TANTRUM); +} + +SINGLE_BATTLE_TEST("Stomping Tatrum will deal double damage if user flinched on the previous turn") +{ + s16 damage[3]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); SWITCH(opponent, 1); } + TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[2]); + } +} + +SINGLE_BATTLE_TEST("Stomping Tatrum will deal double damage if user failed to attack due to paralysis") +{ + s16 damage[3]; + PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_POTION); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_LUM_BERRY); }; + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); MOVE(opponent, MOVE_THUNDER_WAVE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TRICK); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[2]); + } +} + +SINGLE_BATTLE_TEST("Stomping Tatrum will not deal double damage if target protects") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + MESSAGE("Foe Wobbuffet protected itself!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Stomping Tatrum will not deal double damage if it failed on the previous turn cause of Protect") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BRIGHTPOWDER); }; + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM, hit: FALSE); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + MESSAGE("Wobbuffet's attack missed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Stomping Tatrum will deal double damage if user was immune to previous move") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); SWITCH(opponent, 0); } + TURN { MOVE(player, MOVE_STOMPING_TANTRUM); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[0]); + MESSAGE("It doesn't affect Foe Pidgey…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOMPING_TANTRUM, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + } +} From 0a55a7f40bd8ed14b71e6a8dfbb24da0121d83e4 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 17:29:09 -0700 Subject: [PATCH 075/225] Combined if statements per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712962988 --- src/field_control_avatar.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 1699a6daa2..584c319595 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -183,18 +183,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input) return TRUE; } - if (input->checkStandardWildEncounter) - { - if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) - { - GetInFrontOfPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) - return TRUE; - GetPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - } - } + if ((input->checkStandardWildEncounter) && ((input->dpadDirection == 0) || input->dpadDirection == playerDirection)) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; From cb779498811f9c9a7d48bffd2a434abb2967d37d Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 17:30:59 -0700 Subject: [PATCH 076/225] Fixed identation per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712963035 --- src/field_control_avatar.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 584c319595..c9163c1a7e 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -183,15 +183,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input) return TRUE; } - if ((input->checkStandardWildEncounter) && ((input->dpadDirection == 0) || input->dpadDirection == playerDirection)) - { - GetInFrontOfPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) - return TRUE; - GetPlayerPosition(&position); - metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); - } + if ((input->checkStandardWildEncounter) && ((input->dpadDirection == 0) || input->dpadDirection == playerDirection)) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + return TRUE; + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; @@ -205,7 +205,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); if (input->heldDirection && (input->dpadDirection == playerDirection) && (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)) - return TRUE; + return TRUE; if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; From b39258ebced39d8cf858c8f5551619fa5e5a271f Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 17:36:01 -0700 Subject: [PATCH 077/225] Combined conditions per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712963093 --- src/field_control_avatar.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index c9163c1a7e..40992feae6 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1093,9 +1093,7 @@ static bool32 TrySetUpWalkIntoSignpostScript(struct MapPosition *position, u32 m { const u8 *script; - if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) - return FALSE; - if (playerDirection != DIR_NORTH) + if ((JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) || (playerDirection != DIR_NORTH)) return FALSE; switch (GetFacingSignpostType(metatileBehavior, playerDirection)) From 846e8a29daadc96035944250dde9b391e8fe2846 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 17:49:07 -0700 Subject: [PATCH 078/225] Removed IsMsgSignPost per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712963672 --- include/script.h | 4 +++- src/field_message_box.c | 2 +- src/menu.c | 2 +- src/script.c | 9 ++------- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/include/script.h b/include/script.h index 48d1f6c0ec..fc50c9d424 100644 --- a/include/script.h +++ b/include/script.h @@ -63,10 +63,12 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize); // srccmd.h void SetMovingNpcId(u16 npcId); +extern u8 sMsgIsSignPost; +extern u8 sMsgBoxIsCancelable; + void SetWalkingIntoSignVars(void); void MsgSetSignPost(void); void ResetFacingNpcOrSignPostVars(void); -bool32 IsMsgSignPost(void); bool32 CanWalkAwayToCancelMsgBox(void); void ClearMsgBoxCancelableState(void); diff --git a/src/field_message_box.c b/src/field_message_box.c index 9d07ce24dc..c0fc1004e9 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -32,7 +32,7 @@ static void Task_DrawFieldMessage(u8 taskId) switch (task->tState) { case 0: - if (IsMsgSignPost()) + if (sMsgIsSignPost) LoadSignPostWindowFrameGfx(); else LoadMessageBoxAndBorderGfx(); diff --git a/src/menu.c b/src/menu.c index 441c80250e..20b8c4dd97 100644 --- a/src/menu.c +++ b/src/menu.c @@ -328,7 +328,7 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi static inline void *GetWindowFunc_DialogueFrame(void) { - return (IsMsgSignPost() ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); + return (sMsgIsSignPost ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) diff --git a/src/script.c b/src/script.c index 98d679cd9f..632af41ff4 100644 --- a/src/script.c +++ b/src/script.c @@ -27,8 +27,8 @@ static u8 sGlobalScriptContextStatus; static struct ScriptContext sGlobalScriptContext; static struct ScriptContext sImmediateScriptContext; static bool8 sLockFieldControls; -static u8 sMsgIsSignPost; -static u8 sMsgBoxIsCancelable; +EWRAM_DATA u8 sMsgIsSignPost = FALSE; +EWRAM_DATA u8 sMsgBoxIsCancelable = FALSE; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; @@ -513,11 +513,6 @@ void SetWalkingIntoSignVars(void) sMsgBoxIsCancelable = TRUE; } -bool32 IsMsgSignPost(void) -{ - return sMsgIsSignPost; -} - void ResetFacingNpcOrSignPostVars(void) { sMsgIsSignPost = FALSE; From c3c433439e2f5745782b01ef42e6915783dd5655 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 18:01:52 -0700 Subject: [PATCH 079/225] Removed ClearMsgBoxCancelableState per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712963672 --- include/script.h | 3 --- src/field_control_avatar.c | 4 ++-- src/scrcmd.c | 4 ++-- src/script.c | 15 --------------- 4 files changed, 4 insertions(+), 22 deletions(-) diff --git a/include/script.h b/include/script.h index fc50c9d424..a8e7656d51 100644 --- a/include/script.h +++ b/include/script.h @@ -67,9 +67,6 @@ extern u8 sMsgIsSignPost; extern u8 sMsgBoxIsCancelable; void SetWalkingIntoSignVars(void); -void MsgSetSignPost(void); -void ResetFacingNpcOrSignPostVars(void); bool32 CanWalkAwayToCancelMsgBox(void); -void ClearMsgBoxCancelableState(void); #endif // GUARD_SCRIPT_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 40992feae6..6144ca7af0 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -162,7 +162,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) gSpecialVar_LastTalked = 0; gSelectedObjectEvent = 0; - ResetFacingNpcOrSignPostVars(); + sMsgIsSignPost = FALSE; playerDirection = GetPlayerFacingDirection(); GetPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); @@ -1130,7 +1130,7 @@ static u32 GetFacingSignpostType(u16 metatileBehavior, u32 playerDirection) static void SetMsgSignPostAndVarFacing(u32 playerDirection) { SetWalkingIntoSignVars(); - MsgSetSignPost(); + sMsgIsSignPost = TRUE; gSpecialVar_Facing = playerDirection; } diff --git a/src/scrcmd.c b/src/scrcmd.c index e1d6202a04..69c9d961b6 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1290,7 +1290,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); - ClearMsgBoxCancelableState(); + sMsgBoxIsCancelable = FALSE; return FALSE; } @@ -1309,7 +1309,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); - ClearMsgBoxCancelableState(); + sMsgBoxIsCancelable = FALSE; return FALSE; } diff --git a/src/script.c b/src/script.c index 632af41ff4..7945b57ea9 100644 --- a/src/script.c +++ b/src/script.c @@ -513,21 +513,6 @@ void SetWalkingIntoSignVars(void) sMsgBoxIsCancelable = TRUE; } -void ResetFacingNpcOrSignPostVars(void) -{ - sMsgIsSignPost = FALSE; -} - -void MsgSetSignPost(void) -{ - sMsgIsSignPost = TRUE; -} - -void ClearMsgBoxCancelableState(void) -{ - sMsgBoxIsCancelable = FALSE; -} - bool32 CanWalkAwayToCancelMsgBox(void) { return sMsgBoxIsCancelable; From 4387b6ef708b88cffbe4660e7df6574cfabd6409 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Sun, 11 Aug 2024 18:10:18 -0700 Subject: [PATCH 080/225] Removed SetWalkingIntoSignVars per https://github.com/rh-hideout/pokeemerald-expansion/pull/5044\#discussion_r1712963824 --- include/field_control_avatar.h | 3 +++ include/script.h | 3 --- src/field_control_avatar.c | 9 ++++----- src/script.c | 12 ------------ 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h index cbee293a31..da23fe4336 100644 --- a/include/field_control_avatar.h +++ b/include/field_control_avatar.h @@ -36,4 +36,7 @@ const u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position); void ClearPoisonStepCounter(void); void CancelSignPostMessageBox(struct FieldInput *input); +#define NOT_SIGNPOST 0 +#define WALK_AWAY_SIGNPOST_FRAMES 6 + #endif // GUARD_FIELDCONTROLAVATAR_H diff --git a/include/script.h b/include/script.h index a8e7656d51..9c778c395d 100644 --- a/include/script.h +++ b/include/script.h @@ -66,7 +66,4 @@ void SetMovingNpcId(u16 npcId); extern u8 sMsgIsSignPost; extern u8 sMsgBoxIsCancelable; -void SetWalkingIntoSignVars(void); -bool32 CanWalkAwayToCancelMsgBox(void); - #endif // GUARD_SCRIPT_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 6144ca7af0..05060825fa 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -44,8 +44,6 @@ static EWRAM_DATA u16 sPrevMetatileBehavior = 0; u8 gSelectedObjectEvent; -#define NOT_SIGNPOST 0 - static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); static u16 GetPlayerCurMetatileBehavior(int); @@ -1129,7 +1127,8 @@ static u32 GetFacingSignpostType(u16 metatileBehavior, u32 playerDirection) static void SetMsgSignPostAndVarFacing(u32 playerDirection) { - SetWalkingIntoSignVars(); + gWalkAwayFromSignpostTimer = WALK_AWAY_SIGNPOST_FRAMES; + sMsgBoxIsCancelable = TRUE; sMsgIsSignPost = TRUE; gSpecialVar_Facing = playerDirection; } @@ -1176,8 +1175,8 @@ void CancelSignPostMessageBox(struct FieldInput *input) return; } - if (!CanWalkAwayToCancelMsgBox()) - return; + if (!sMsgBoxIsCancelable) + return; if (IsDpadPushedToTurnOrMovePlayer(input)) { diff --git a/src/script.c b/src/script.c index 7945b57ea9..276163bbb6 100644 --- a/src/script.c +++ b/src/script.c @@ -505,15 +505,3 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) #endif //FREE_MYSTERY_EVENT_BUFFERS } -#define WALK_AWAY_SIGNPOST_FRAMES 6 - -void SetWalkingIntoSignVars(void) -{ - gWalkAwayFromSignpostTimer = WALK_AWAY_SIGNPOST_FRAMES; - sMsgBoxIsCancelable = TRUE; -} - -bool32 CanWalkAwayToCancelMsgBox(void) -{ - return sMsgBoxIsCancelable; -} From 30cc06785d5906750fd945fce8a482af2298da02 Mon Sep 17 00:00:00 2001 From: pkmnsnfrn Date: Mon, 12 Aug 2024 06:55:33 -0700 Subject: [PATCH 081/225] Fixed global variable naming conventions --- include/script.h | 4 ++-- src/field_control_avatar.c | 8 ++++---- src/field_message_box.c | 2 +- src/menu.c | 2 +- src/scrcmd.c | 4 ++-- src/script.c | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/script.h b/include/script.h index 9c778c395d..1f3c4f7afb 100644 --- a/include/script.h +++ b/include/script.h @@ -63,7 +63,7 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize); // srccmd.h void SetMovingNpcId(u16 npcId); -extern u8 sMsgIsSignPost; -extern u8 sMsgBoxIsCancelable; +extern u8 gMsgIsSignPost; +extern u8 gMsgBoxIsCancelable; #endif // GUARD_SCRIPT_H diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 05060825fa..b64301e670 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -160,7 +160,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) gSpecialVar_LastTalked = 0; gSelectedObjectEvent = 0; - sMsgIsSignPost = FALSE; + gMsgIsSignPost = FALSE; playerDirection = GetPlayerFacingDirection(); GetPlayerPosition(&position); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); @@ -1128,8 +1128,8 @@ static u32 GetFacingSignpostType(u16 metatileBehavior, u32 playerDirection) static void SetMsgSignPostAndVarFacing(u32 playerDirection) { gWalkAwayFromSignpostTimer = WALK_AWAY_SIGNPOST_FRAMES; - sMsgBoxIsCancelable = TRUE; - sMsgIsSignPost = TRUE; + gMsgBoxIsCancelable = TRUE; + gMsgIsSignPost = TRUE; gSpecialVar_Facing = playerDirection; } @@ -1175,7 +1175,7 @@ void CancelSignPostMessageBox(struct FieldInput *input) return; } - if (!sMsgBoxIsCancelable) + if (!gMsgBoxIsCancelable) return; if (IsDpadPushedToTurnOrMovePlayer(input)) diff --git a/src/field_message_box.c b/src/field_message_box.c index c0fc1004e9..569f067caa 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -32,7 +32,7 @@ static void Task_DrawFieldMessage(u8 taskId) switch (task->tState) { case 0: - if (sMsgIsSignPost) + if (gMsgIsSignPost) LoadSignPostWindowFrameGfx(); else LoadMessageBoxAndBorderGfx(); diff --git a/src/menu.c b/src/menu.c index 20b8c4dd97..d9b331a8b2 100644 --- a/src/menu.c +++ b/src/menu.c @@ -328,7 +328,7 @@ static void WindowFunc_DrawSignFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 wi static inline void *GetWindowFunc_DialogueFrame(void) { - return (sMsgIsSignPost ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); + return (gMsgIsSignPost ? WindowFunc_DrawSignFrame : WindowFunc_DrawDialogueFrame); } void DrawDialogueFrame(u8 windowId, bool8 copyToVram) diff --git a/src/scrcmd.c b/src/scrcmd.c index 69c9d961b6..23b42b7acd 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1290,7 +1290,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); - sMsgBoxIsCancelable = FALSE; + gMsgBoxIsCancelable = FALSE; return FALSE; } @@ -1309,7 +1309,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); - sMsgBoxIsCancelable = FALSE; + gMsgBoxIsCancelable = FALSE; return FALSE; } diff --git a/src/script.c b/src/script.c index 276163bbb6..7b1af3d542 100644 --- a/src/script.c +++ b/src/script.c @@ -27,8 +27,8 @@ static u8 sGlobalScriptContextStatus; static struct ScriptContext sGlobalScriptContext; static struct ScriptContext sImmediateScriptContext; static bool8 sLockFieldControls; -EWRAM_DATA u8 sMsgIsSignPost = FALSE; -EWRAM_DATA u8 sMsgBoxIsCancelable = FALSE; +EWRAM_DATA u8 gMsgIsSignPost = FALSE; +EWRAM_DATA u8 gMsgBoxIsCancelable = FALSE; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; From 5df53a5c1c1e67b8c333e15bfe5411f6fb722d36 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 12 Aug 2024 21:39:11 +0200 Subject: [PATCH 082/225] Added fixed Unown follower sprites by Sarn (#5146) Co-authored-by: Hedara --- graphics/pokemon/unown/b/overworld.png | Bin 299 -> 419 bytes graphics/pokemon/unown/c/overworld.png | Bin 348 -> 462 bytes graphics/pokemon/unown/d/overworld.png | Bin 330 -> 443 bytes graphics/pokemon/unown/e/overworld.png | Bin 305 -> 422 bytes .../unown/exclamation_mark/overworld.png | Bin 2556 -> 360 bytes graphics/pokemon/unown/f/overworld.png | Bin 301 -> 419 bytes graphics/pokemon/unown/g/overworld.png | Bin 316 -> 426 bytes graphics/pokemon/unown/h/overworld.png | Bin 321 -> 433 bytes graphics/pokemon/unown/i/overworld.png | Bin 263 -> 377 bytes graphics/pokemon/unown/j/overworld.png | Bin 286 -> 399 bytes graphics/pokemon/unown/k/overworld.png | Bin 289 -> 402 bytes graphics/pokemon/unown/l/overworld.png | Bin 294 -> 404 bytes graphics/pokemon/unown/m/overworld.png | Bin 319 -> 428 bytes graphics/pokemon/unown/n/overworld.png | Bin 323 -> 438 bytes graphics/pokemon/unown/o/overworld.png | Bin 317 -> 428 bytes graphics/pokemon/unown/p/overworld.png | Bin 278 -> 392 bytes graphics/pokemon/unown/q/overworld.png | Bin 313 -> 430 bytes .../pokemon/unown/question_mark/overworld.png | Bin 2741 -> 405 bytes graphics/pokemon/unown/r/overworld.png | Bin 276 -> 391 bytes graphics/pokemon/unown/s/overworld.png | Bin 322 -> 436 bytes graphics/pokemon/unown/t/overworld.png | Bin 260 -> 369 bytes graphics/pokemon/unown/u/overworld.png | Bin 299 -> 409 bytes graphics/pokemon/unown/v/overworld.png | Bin 272 -> 387 bytes graphics/pokemon/unown/w/overworld.png | Bin 271 -> 385 bytes graphics/pokemon/unown/x/overworld.png | Bin 281 -> 398 bytes graphics/pokemon/unown/y/overworld.png | Bin 287 -> 402 bytes graphics/pokemon/unown/z/overworld.png | Bin 313 -> 419 bytes 27 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/unown/b/overworld.png b/graphics/pokemon/unown/b/overworld.png index b2500cca0cd4b49f896564dd672d1c9c03929b08..1e8ab69c117e625fc102b25ca591dbbf8f8ccd85 100644 GIT binary patch delta 393 zcmZ3@w3vB`sf3l26xHjcEt2NyChFo>79MwA5SrR}8R%`D`i2xK!RdAqwXbg;^L06E7!T^vIy=DfXf zkoS-Q59@`B=3Om}36m8zGb~~*NcbD~VS zt?ViO)1@2&zHDE{%f?VEFX6!BGJ$Ew(}&8^tZm0d9^^Y5tJrz*_E(Fqj0-<1)Z}Vg Rw}3qB>FVdQ&WS0Z2>|ZEiopN? delta 272 zcmZ3?yqal(O1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z4BI?i978JRyq)69)oQ@gvisD@Cl3u{rUZO{Bq%3$`&U?6lkA~rPRRnpxd!p|2ZDlD zhG>0Ndig0{k7t7uqu8cBjqVHT<>IXwTXo7Ao-e<-CL!^%*_oT2OWw_vWLyv@#VE_L zCuHq+HU=&xnF-8qI0ZOb`8*h1m!Gda8XNhZS(^0*6U#3d8|E*CyOlL2XvfbhW_wY7 zYd>Sa7xT|NJo64PZWL&IXwDHI`DbGDJf`sf3l26xc12r}j2;FC2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@Ck7}dv*wfo#SkZ+91l4pvzYAm@{(i(^Q|oVQZ~ z`I-y_Ty~qk5U^>u#}cfc@PwhR;=lHeBQE9X6PIp0r z{4bAXPx~&#JaJc1+eyw9ue2LZ|23@PlHkx>dSgz5al<@D3m$`378XX19c&9)`5rX# z90+rGb$oVY;(~Yjs_z+IEIfG4uwa$Tw)R(z+6@2JrX_fNnaiS3D|&Ep>Vq?KOxGBi z49_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z49`7X978JRyqyxrcgTRp`S;Yxz8%S5k~dW`91#>au9hRDa_-u?TjGnR{U`|foy$7$ z(gh&+@6izaoB8iP$ELOKW;@l#*;lu&-RrmNZ&Udll@$RcGgIr=Yn?L;kbm*>guy*# z)z@;@gbkSXv`=|C>#1?FLXczQO<{wNzg-U0?4QZRmbA0@G3O4(4{?k$KF(!T;BYvg z%%EGsz@NfU#mIU2sE@>skY~aSe=pU@GKMppC};fB(3su8cr`w-=X!&5I>!wrD-NeQ zuMf}nw>=p5;@pomq3^~USUn!G3o(`0F<3JmWM_CT{jdEi)0Y?Z)~CMQUI6qogQu&X J%Q~loCIDTgnLq#l diff --git a/graphics/pokemon/unown/d/overworld.png b/graphics/pokemon/unown/d/overworld.png index 426e517d5df4b06d05a19b2288a0f406a055e7e9..d8796d020083830aa2f931832747b577d60fac67 100644 GIT binary patch delta 417 zcmX@bw3~T?N`sf3l26x4wX~S8qP279MwA5SrR}8R%`D`i2xK!RdAqwXbg;^L06F(PT^vIy=DfXf zkoS-Q4{Jbr^A0WM18S~`j4tdC4*b)eaPQB5aZdsDB|p-9KEG1ic(X^+IPJ`j#Rd7( zCO`l7c_qKa(;aqay|u!J@&niYPL!6t z5#@D9k+tHo>UwtTc}gs=mmNBoUcm66x_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3|Bo}978JRyuD(`cUXakHNbz4PFEFA+ly}I5L>6K$>L`J--~%zyB?bD{Gpj8XIs+I zE>Ueg5r=XM#qZCT8#0{SxsRcqQD+jnz_DNn7e5oJ0}L7WPFBkK>I{3?d0uS{DPX(c{#EPY?TEc6mcKvP9`_{vqQ*4= qGXv%fzx<41?gq2%iRF9!_Ar))=4_9Zeb55*B7>)^pUXO@geCyKqKF~@ diff --git a/graphics/pokemon/unown/e/overworld.png b/graphics/pokemon/unown/e/overworld.png index 741a5ef42e1427da054fe295f6bf44ff6257375a..34fd50f0040e92fcedfb2417da1470b5c77d5949 100644 GIT binary patch delta 396 zcmdnUw2XOzN`sf3l26xPMP2TIfWS*7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^EyxmZR_X4 z;MmgpCoEXn!hc(tgWZD$7KI56*IqWUHGVOEB~;Jwq;9h;i`zbCiwFNqWZBOB%J?Pd zaP4~a%4mkJRZ;Q>7$&4neI3**d!U9PYyN?A<{uoSUo?C)*Z7_0c4(sL)n_M!)~{V% zxRLS8KGtIlW)e4E|7Y0J`0hBD`y+-3UZJ;(;ux+^k1jiVxo&6c?XNb!82VG>k~yuV Rn?U~cboFC(S?83{1OP$si!%TK delta 278 zcmZ3+ypd^wO1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z40}9X978JRyq)66b=ZK1rS{Wlr9EbK!w_Et-rf<q-V@91VEv?qfpx*HZT5FJGDrA3ycf3E+05~!k#WWUM&15>!hJmQ zHhY=b1SD$XSXepI)tK}cjyY6rG+|hL@QThX)`FVWMDrNg_StjReZMHbq9-YRI=}vH R1E5bBJYD@<);T3K0RWj8d`$oV diff --git a/graphics/pokemon/unown/exclamation_mark/overworld.png b/graphics/pokemon/unown/exclamation_mark/overworld.png index 4271c7ab99a223d67cfe3431f957ca0a2ffc1213..96073167d0ab7a66365f64460cfef042896a1ed8 100644 GIT binary patch delta 334 zcmew({DNtMay>K`y~{$!fU_3=HBWt`Q}{`DrEPiAAXl?mjL7e(nlo zsYMFLdM1UfOCAE1aFi7IxdUa4fouk^22FV&#ggvm>&U>cv7h@-A}f$@5a1KydiLxZ zATuFjf`dndhJnM27e99F*Z~xQf_fMOPBRO+C;~Z*N#5=*3>~bp9zafyr;B4q#hkZO z4ssqg;BkG*t70yzaPNrg-35{h+TZMVI#>9xzQ;pxL4EbKr|ie3d8kc3nUXi9s4#Zb zqqdA#xx;N68?Q?KmoYefdOxdjyuLxNp>RaB>7kH-X!qa~|C-LQES+6?x_f@;gh@RL~E3(Nt<=?9}dyGzp2>fGzT(J1^S366F9XF+9)mFd#26D2etDnm{ Hr-UW|@49qP delta 2547 zcmVaB^>EX>4U6ba`-PAZ2)IW&i+q+O3ysmLsVV zM*p)4FM$XM0+z$`oY{ew?@LNmUDe(8%-B{+$`nZg5#J+F*#G?Fgn#goR&&VawX{+q zuiSFe&P9!{S9`uC=I8r)&G#*Se`^o=aYJcJoYU*4_jmtJyMO(7;A0LM-`hid-_iOW zNInOCUg^$!uh-W_(yp&|$?t*MeqEGS{p(W4d!YI5_$=l9$)C%5o$l}Ot-;CCGA2r@ zJ4uSqcYduPy*`~!;agLtpCo%)THutDz6T>A-@^Mi$M`it-;(@s6@JdX_TML8`@2W_ zDVOD)BQAb>Lx1e2_VhWwew{ddu1LS%sQqK8Uz2>!s^{!ibUha`THcI$k}V&@&~cFR z^gLELoR4ws&(Sz)>~RA5f|-M3N)rW@6C}%$E=Trro-$ct)~(K2b!vLrYI1El)5R&@ zLymfCX{8E&Q+EKfob+=o^32dHSkp(c6qS0feC} z2b-2UV1MOo@W*q7L*0^PGb`p+gEi|Vm0YZp;^mrL_vG2li@R5E-fOD4S}oOUt*!Q^ zE#ZOIO7m7*YrSjeOw<{x)4$U)bfl4ojWT@H(MF%pXXa_MOrLeO*_W=gu!&Wcue#dm zTf)XEcHXwj_FZ?|{lK-8PCjy=V=g$otlhWE zwh`-)Y`k-1A?a9IrO%TMKWXL21m#gJNPnFk(}1j}PJ^`g^(0o@+9qYS7;tagt_hrKlo@hC{5FSp)3r3$ zIeEV6ZW_eqMt1~v(>zxhi^s}BZ%;rmT3&gdotB=w;OB1exud4GAz zUi-N+lvZ@s-7}-38SSg4HA_aOV6<7fl?X|PZMZK>yFH&3c3C{Lt>k_6CK+C@xnXp5 z#_G)h{Dvf(V!5PQ9dqKxPzABo+gqrFfi$=?0);lmK6XA%nN4Fo)a$PZ4Y}VNbVo6Tq|q1mC!7+ z&4wUzTbtyq+@C2MQ$7TVg3XK)Mk?Nwx;cjvtl643V~LD0m9v|k4bFRCcH*tKTx z{iJ+|jZKYX)}ir`7m6<{?q1sEOioR1@VSyyLfFsBP~g$tVeHB?(pNNkkDOA zKREo_jnNbAqE|^e2h+~e3xBtt2zItIx+8ep0ljXYGMpalt*ix7N?kZQagNGPZNhOU&Pk>tt2xp}T4<|vG+}+ONE8}_^B~y=u1PZ%Ceynh*53)img@{?p z7zh7~y`5I$^)NJB^?xO3>SIq-LwhCimZLezDjA=cLR>aaMS1Mz*x=RG$!AqFaDY{C z2Ed^tUY@Y`M%t*el2=GnXC&CB=eud$gOa_mTPpDlaAhg$F?dhcqZ^fggy|S#AI~>J zBj3G;y#V55sT6;B%kJSimBvpyLVMs!^t}POPy`m{!rs6OgMX4oHVv~bwtlgL<2ZOa zo3%xy&$k9@*M?-|6P6DPcQ$TfBO6q+zNoXOj=aM#HXII_WHgi`x1)-Azo z=dTMUdq-rC#lF7#P0YZF;)}C^y%UmTTkaz3+Xw`wkEqWu{qOT zX0oed;1xZHAVlk^%q(M0l9KQoU-$6w{Vv9{yzBlP{eNoCVt`L1o@ItvCEg&O-mDs& z_ld)-D67Qh#A7C1kob}7ipy`D3l0lBGi;_)^Tc6dvCzRv2eYE75l<0ERZXXSA>*>j zd5g1FuCdlV`3r+NePx;JG>4GDB9w#001yhOn+2G&CRU;0RR60|Nj90-rnB-|NjsW z5TvA}b8~Z2Qd0i_|Nj90{{a900RR60|Nj90lMVIt00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF->t7!wI1K`x$P0001WNkl1+cp%wvN=*BwH-#@H-Lk|bG(GI(y)`GPvP)A>R)kNkI_*D*VQ=>hm)Z;vY;25M_g z9hG_%DEJUO4jeeZTo2qAn5zN9wmWrzdK?H2$N~ACm)_rX9bVFrRju6ZN@4&2002ov JPDHLkV1nyS@;3kg diff --git a/graphics/pokemon/unown/f/overworld.png b/graphics/pokemon/unown/f/overworld.png index ea3332e941fec718005c262d0c32954bf0900999..789e65cc1de3569feefe0d28839ad5b68b3f9dc3 100644 GIT binary patch delta 393 zcmZ3>w3vB`sf3l26xZk{W3)n6GH7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^EyxmT z=4<_(T=oo!tD4Sz332z+Sj^6Rt&AvVc=G4gzU~$4jp`S4T#1^lJi&|QgfFw0O9Fd| z!_AqDnGVg9Dnu4+s=Jk4?;xhRb(Jdf2KJ1*lkFtLa!mI+a(rWW7s2E)L1F`c0QVEe zV|DNBJBs*c$TWUdaIR;Y5Sw+p{LBeE%h|^n3Z+gyww2)Bb7#@*uTCGCS)VBczGdP0 Q4f3p~tDnm{C#HlZ0JtcK-v9sr delta 274 zcmZ3?yq0N#O1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3_Cns978JRyq#jm$E?W168kfCxyJbg4r2TrpIS7|pL=goRY84itsu~L=wY}?-Q8Cz_Kl)h%oP`UPe`^?*-3~yHp8ocsY9m?;Z zz+A^*&G1t>z~%t++80_5IlF(Va@ah&%f;r$_>IB7?ZDn=j68D~OU_SfaC*jnU_8VQzITG%ZSOq!_fju}8MuMo N@O1TaS?83{1OP*`sf3l26x9>%AA6Z;t$7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^EyxmmdKI;Vst0H_&-v;Y7A delta 289 zcmZ3*yoYImO1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z497iP978JRyq)66b=ZK1rS#Kjr`V%C1XeKaYn#vEz#>qvg^6h%>kR$rf4R2y zygO>Zuw0EPQhu(|WPfMhugna09<1zh;B4qV&$h!+<^jWjV`e?uU!4B=`{${mH62n~ dB0uGib0-O9@=vZc+Y0m)gQu&X%Q~loCIBbmhu;7I diff --git a/graphics/pokemon/unown/h/overworld.png b/graphics/pokemon/unown/h/overworld.png index 9abe3e40010435444e7dbc9a94ce90c5dc9e9f40..a5f030dbd6011979dd9f59efdf4dafb53f69dd14 100644 GIT binary patch delta 407 zcmX@ew2^s&N`sf3l26xUdBID7o1~YU=S~HjVKAuPb(=;EJ|f?_i+jEb5|%! zEmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7M+SzC{oH>NS%G|m0G|-ovuD=; znF$#a96Ta43>;p(__1Th4xk7O)WaAsnpwz25y)mt@^*J&=wOxg0CKK+x;TbZ%y~QI zF7F`&o|d`1MWK=mW{fjg1!No8zr{C(cnHk*j=8ej%W@_EJI(JWe{S>$2ZHN$Q;f`h zPGXXlRBL2Xj!!w^tMKXfZ&8V#atW`eJb!wXi>v2P{USq#2PJD}Jv(qBp5ca+kGUr{Icg1P9tH-8s z-q&1rdLiSp0NsLv<_AO>%5{Acp0qQ3-w?3sN=3z+b_R2)XS+_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3}-xD978JRyqyxr)odW(@?Bef@}=ZA?vX_emz1Z-?dEivJ@=~55q(AFx}0NYj4!S^ zaRmfQr(E&-IjJKzOOKIhX1)HTt=uND@Ao=9b8lEb`P$2~JRB+e5=0rlRhoAnb9k1| zz@T5bGy7L>V!}t=@*2Jk$6sguH)OfB>RR~$L5H2Q7+91TUOm?4IIx*vga#svmHf3VP>aiQszsN=O<9A{U{v%CFVdQ&MBb@0C6;o+5i9m diff --git a/graphics/pokemon/unown/i/overworld.png b/graphics/pokemon/unown/i/overworld.png index 39aa3b8572199448f2de292cce8c0766a7b9300b..b360c0faac3b951477fff43841dfdd94048a9ed0 100644 GIT binary patch delta 350 zcmZo?`pGmwrJlXS)7O>#1qYj;n&BFoTy6#i2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@Ck7}dv*wfo#SkZ+91l4pvzYAZM{tWVwMTHS(=j#=cN2`~{iUJJaAhaUEe4$j2kzZr+4F8c`-A6Sw*B9j X=Ta@bJdf+S0>}%Vu6{1-oD!M<sJN_ zhDn|-jv*Cu-cH%bbwGi~#rS7x&@V|@l^c7%2z%M@?mNrMvxv_rZ}*&??R-KzWAvtH zE4H4re7bnwh1r)m*$WPy(p}G$5@jpRP$zHM$fO<4z}mBWMndAVn6tVL9^a3OCOlXq zb%CuQ>7l9sBiD^8X4W^X0>|Il2l|Koa=FJhftBNmWrc79^XdiC26xW0KX`6(OMeaj Y$>o8kJr2)J2Re_z)78&qol`;+0Faexw*UYD diff --git a/graphics/pokemon/unown/j/overworld.png b/graphics/pokemon/unown/j/overworld.png index af240eafd38ac6c7c4f941c00b56c9393bae28ac..e1c88938d7bbae3950aec4c44a287cf120d62234 100644 GIT binary patch delta 372 zcmbQo)XzLYrJlXS)7O>#1qYj;23r@?(=G-E2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@Ck7}dv*wfo#SkZ+91l4pvzYAZN3ui(^Q|oVQmF zavnC|VGYP;KD~okMLMNLq_lAo&jsi2@e8lN;{Kx9>g4!eZOMS{k%6q)y`P ztdgbK=l6?m`?o8HQ{(ooJ=}sa0m>HVcF%SwxN(({!7Y~|Yp3nJYNoE4Kliam&*r&s z`dt>klE49mGd1jtf5b9A+uWJ>V50BlFDEn>yjsuNu<^YkpUIB09SU!Q9SXc7p4%VE wX4tTdS%ky=!$SsUm(R2K9$Y?fZ<+lmZsr#0-O_OuDj<(}y85}Sb4q9e05T|o_W%F@ delta 258 zcmeBYp2svnrQRUGC&cya*){(e{zK5cd-wkT|1TgQuw==S;^N|sJN_ zhLxT!jv*Cu-cGs5*^E$UF<*ttLZT(!i;rAvZV zhG>0VxFySA>MGN^xQPGzWElgh`)YR!+iYlbPmord?2r(Axxs;-LI3lv8KR5LhFN`sf3l26xO-9~Y#|#Dr2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@Ck7}dv*wfo#SkZ+91l4pvzYAZMGWi(^Q|oVQaB z@*Xnaaed7DNQkY0*UD)^B*R5Uiw*y|4xIhBaE3$miYN8Ie{P(w`!qw^|Ewpyd za>aVRALjnnI~rKy-u+zWxL%*Hp}+miW?qf`pY$A<=M?DKoMXzAd9p<79)m2y-2CsW z`Wa3r1zjy=sAGOmYkH6AB$L1mdq$>>icEiHr@TCsb&^3vPifbpxeXt$E=V_9e}ZYg ycWUfKhFS(Wg$vI({xELX5ij2`|MI1}!&MBgJ!JR4ExfY}_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3~M}H978JRyq#jrcgR4%CHCz}r6YzhE{iWH_cd5Jo|E=@Dk&`H9OQEA<*~7;T-sRsqe_Hb>fblSVb z+<`se@mnuvCYM0d*oONI22D21y^LIM?l&@RUC8v;`ar=VgTe~DWM4fa3p#d diff --git a/graphics/pokemon/unown/l/overworld.png b/graphics/pokemon/unown/l/overworld.png index b11096a1ab728da126eb4716749078ff2a215c94..dbbe738b8bb2ca7fefaa52ac05f16f66ce0dbbf9 100644 GIT binary patch delta 377 zcmZ3+G=+JBN`sf3l26xO2lJ4m1$iT3%pZiZDE0Avx;1l9{_UsxU zGa+MwgGYphfy0XzKX&Zc0Th9OdKd#nGYh#W0@;j7-tI089jvk*K+X8H&F zlf~9gQ2Qt?lrVF7_`yaae{YVm9}Xu6)hOVlPr+FpYoLZ^{&U^&8`oiHt>2 zzPXMpGA|kg-ydka&t$S~wj^g?&Wbi=Z$`oD9ELBo+|L*uZWO7R@TFLRt>0exUHVq` z1#S<5KkR(IAZ-T6wR{F124#VD-@=`X%>M?LU9FYgzf2)#2FQ1wu6{1-oD!M_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3>!UN978JRyuEUe^RNLAYrtHaNDbM;?H@ies4BPkOsIUF{Kfu6A$M!jKi_SO(`D4t zX8Nd2KKVyy>7rxW0fOZc49_>#$FnjPzDegWyQR>aTWQtcko`fHC8gojrab-a%4`>f z8;`l`Fof;6)y%`8!Ep7`goF8vhd=G;J2CNVU0$8s2VRLQl^;x{8Eg!)J}?S2|2^ID z{5j()$r-G^aZ>lCzB61mZ*X!*RESx-zwO}um-9cd{r(V8yrbNZ73g{fPgg$|mUT`E FO#m^Hd_n*K diff --git a/graphics/pokemon/unown/m/overworld.png b/graphics/pokemon/unown/m/overworld.png index 0d5f60e297013c1b355d5085da527a88198dc32a..19524911541f4c12e51ba4c796a79f4a62e85aa0 100644 GIT binary patch delta 402 zcmdnbw1#`sf3l26xEw$#T11JIm^)LpEW)^Z$1hN^EyxmWO|B$^*$a*Z8yFTbe>nJ0dxC;X^70$4b&5~_z43m3G*e{JGBB9V#NO~> z^Ze;I8U#HbA9pzK|LO)yQ}wYuF6_JNcqf!5yxLiRXChz8pCtzwA8dI3$RlLIbA5&s z-dD@G+spmg)$Hf-+-Gn3{I+fmvx$J>F^yWr80G`(crG~b27LW49CBbSgVZu@Y2gb3 ziwjeBE@il|okPGrlu5jXF^2I3Z=tU1g6F#%(j&KBx~`LbyPUByDrd#(_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z45vI@978JRyq)66*KEMUQhVxjz}5604Pg)CzH)}fAE`sf3l26xZSm9dr|o87U=S~HjVKAuPb(=;EJ|f?_i+jEb5|%! zEmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7M+SzC{oH>NS%G|m0G|-ovuD=; znF$#a96Ta43>;p(__1Th4xk7O)WaAsnpwz25y)mt@^*J&=wOxg0CH}5x;TbZ%z1m| zBIh9k0k#LH*>;-oEs*XI4!Oj7gzrJ~@AVHtUElxv=Hw#K@`t}M`&6y3r_+^7An<8* z%MZEhhqAszi8R*bGqSv2d-&iru{RH1>)a@QvO-F!USsW(-g~U!4AI38?wV;aIH=7` zm!Go4$l-2D5JQvE{QisV;SDU>68hHJS!AEFyBmGrfW z2AtaY;j|XRv>9y-r%JvY{3*!5b70Tg2vY`u?Ya%74Kgyk3_mIkvc6_0{WAZ->SL>w j89Yw!UQuKIH&iswYrEo8rLzpjK>^_D>gTe~DWM4fo2{8F delta 296 zcmdnSe3)s1O1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z4Cg#u978JRyuA|0b;y8+?SakL6lWVZdAE%FN0mF&1@^3++2#FDZ>h6D%OC#c64iL? zYeKF{6FpQutzNRnZu_BEFSov^XZo7P$TENJ<-6C!bT(LVhn<@f>ddlq>X{XKI~Z@w z5{}o8WMnWpS^e!`>I(jVnSERi0r!ee+JWRQ*VxSzHCu3m-JM}xDKm>;L)CvisSnW& z6;@Bq@p=3zwY$l|a9_fafkB30+WkD)Y==L&m+Kt(`q&t1d`Pt|FKf><0}t_ iplb22@0aaA#cchtl;3&fsaHV1F?hQAxvX`sf3l26x9pUE9M^YIW7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^Eyxm3>$W&tLy%xye+{MvJ$Yw;cCE$&*kSIaIlIJLPxh~dHMnL9r1GB{PvaLd@|b8|uL z=2pw;(aQad74dP`*B)S!bai>ob%XgqaBM=OSi+z8>IDZDGkAQSET!I{a_L7(!hg-z zpO+f0_P%;xZVaO}!@KPvt$}h(n{>~I9jIj8Y0uA?XCkuIt^MTR4aN6*#J1a?_`kw@ ZL%H(RKhw_oGH?UE=jrO_vd$@?2>@c&l!O2P delta 290 zcmZ3(yq9T$O1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3@1EY978JRyq)6BcgTRpW$&kxT1O1`tXLz%P{?v*W1&M<^6ndsu^T>y#QM0;obE5$ z5VSHxYpR*z=an)BZ?E&d$eF=hZ^G5+Gyi*Z;7WLgSt32{s~XvNGWjvw$zRE}*@m^_?fE!`V3j97ZCH1#UfBJtxc;VP{yJ$f ebGwuOSBO6pZ8le&bKL^yD+W(jKbLh*2~7Y?$A{Jc diff --git a/graphics/pokemon/unown/p/overworld.png b/graphics/pokemon/unown/p/overworld.png index f3699ebdcdbaf109114d2873dd3c3bce8692e251..fc497afc096bb23b98d7a1153690247114024526 100644 GIT binary patch delta 365 zcmbQn)WJMKrJlXS)7O>#1qYj;E_1v5QwIhH2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@Ck7}dv*wfo#SkZ+91l4pvzYAZLxIi(^Q|oVQmF zavnC|VGXEcKD~okMLMNLq_lAo&jsi2@e7wbeYN*!oyYad{N}Oqf_<)9Q@xf3RW2`m z`;qId)cXkxw|CWWvAo)qqiFGsJN_ zhJ~Ikjv*Cu-d;J#*| zn|w0m-IOk=^$xCg7Bb8H{wBgwd}N=j;*E@Eo^6Rm42{`sf3l26xJ+XuDgEANx7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^Eyxm+EE(Y$XU}ik97f zI^nf^)lG&OXF_v&LYXrb^qNN|um>g{Ug~`$y5Up3f$hA-5f;bi-4Q!G0xkQbAe(0&c^+Z)-gPOtP^&HcbZ$OHlqiV-6xUbSCs?K1hG^uWMbG` zTq5JpySjYJC+57F%Y_!qH&gih>uUE0+k{)ozl+S#V|4g_GXL1xnR)7eWfuIOcjx(c b_bNu&my%~_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3`aa&978JRyq$88?~sCk%l9quZmZ^BbT&S8_Xlg+m(8yFcV&|@x61j49YZ!i2l;qC#~Yw0&4 zUd2Z+8dx&;O+ToUc;NCcHns`t{TdkCnOG7F;$N^hwaPPeUFox7eY|krho{o5PfoL| zaBJ{(`>Sr17W&5gBTKvIdGz~3XB(!PN|)s`zW8x2{PDY)?-c&Z9LV>7{qeWBvMob? XvR}31lm$^hA2E2k`njxgN@xNAt1FDM diff --git a/graphics/pokemon/unown/question_mark/overworld.png b/graphics/pokemon/unown/question_mark/overworld.png index e4d210288364040bd08298e5864d79e4640eac28..743b7edbfe9ddbb1eed54c6d3c880e4b17f192cd 100644 GIT binary patch delta 379 zcmdlgI+b~Xay>L4EGspZGs8FffRhxJHx&=ckpFCl;kLxcj&S__-^T zr4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3JuOkD)#(wTUiL5}rL4Z$)>)Eqw zfXsx92@W0+8U_w8Ui{dxV+T+K3hH4DIL$2Nq6p+LCV9KNFm$lWdH^{)JzX3_D(1YM za*+410*`AVv(F{QLu@OA11zPtFn_u5H#}qgpOE{GUxH5l|CZCvE~LoPfBf;sKRSUz z@&blp1}r;sLL|Ija%-H~;3(1+vzt>yZ>zani-yBLosx^80Xq)Za2>YNaCmlCpXrIh zRIX&-CDm>X@e2fgY1kApiSTSvov>-Cq#3K^y1R{E-ELYX<|y@UTxGP4b$5)^9BYy|gdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O3ysk|Qe) zM*p*lSpo=zU^##w;_hIUKZmrdx~jWp?jy!ocDhJ15&9mI!~XXlC;W?-#9l*DYqi%J zd6ize48FAZdiCcs#qxYUul2sf|KG-gd|VKQGUxpI*T#GPV1HbH-0-nRn%~DmdtZ_E zeo*>+@bk)d<@?>g2FbX*##4DesPEU8+M9h1b-o|8-V>it-tY1m*6Vct58noiEV;5! z7TG!F_X$5agOn8g1#mB<6HPS`!ar?d>QW< z`KMggcaHe-+kXp5e;Uu9>&w@L^Jhfz{le)VkNP#q=Xg73zjilDC8PDts3+O!<1tK} zq&z>jRSx5=e7EQ594(HxfZSo`mk^OCSoa(#|A)y$gegg2qaZ;f|QbTm0;53uFXA`p1Gn@MWEL$Br+O4~k#Wv&zy{m#wz?8ZMq4oAB!9 z&AX4C!p13f*}Cht-FDyOz_pW4IeO}`(@sC*6MwZgs=pk61GV%SnC4snI1R%6r%wkKW$VKjA7P}w{6@t`@P4ILP1H!VC=t-a0{Xp(7;TE+0 zCEVoCkP8>O{|9mb=zhiRH>mk|s$+g|yDGdnjT!Zw(ucG#WHu~=ul&V-eh&Zi#sWY< z5r1ph88~Ms-lb?8x%RX$QVLe-l(MwVEp3@6$?hhLypLJ?I@RlB&ICXF6QT0wEu^lE zN1^>)zT2$$p7Sj;-?$SVX1eQ~aHut8-HgrePjLw>ZgwUD$3uyE$)Fe|LFeym+y!6h;| zVY_GiNV2!GlGT&9`_%-cYv6^Yqf2+g%QpcKf694^OIDkte5_O%)wX@@;HKF%&3}eW z&sw%o#-81<(A9@g>_ponA-(4{q4Xk(q_Wl_vyeFUg!`s&I!2i^i=wkPPbh1<&ZQt# ztH-n1{*0xry2oBQHHRolYP&{jdqa*HS~|)`)mAq14PuC^SMh4)bV+U2x(Vm3$vgS^M@hglnK%td+sgPNE zQiKOxR9Z8o-f55VaL0nzv2hgjW0GW)sZSOLQ*}-E)9_F~%TUaSjWRIlhPe6AIYF*4 z=dkL%Edx$y>inkY@P#@g;D22(M|hpjDZ08+e>$KdhBB@(4cK_amkM2NyADD5K>TUW ze4(NuY>j)FB=mb^v^8z#Ni9jp0XH+k!`$K~{yf-R7>5X(+c{7D^9&ku-=4EcozC9w zm4;03*%vw*6bN18GEY9k3Yxr9)2Iih)H$6xP^*&E)>hSS)VK~0U4Qqr*u2_s$dafp zI&iXeTCS7_4TqWo6LxD8PD~Wv)JGz_Mp>i@&%lsxu1}$6^xB*znby@N;dkz0KU6`q zwwkCqsR2r(7-QiTKTyk~?LtYL@yVxBi!fJ(oGY{ZKn->(PEHX$0lL%BcB~lG@Lc!S z5FFNl3!U4LmLNICS7eO$t#C6;P;g+=DcvCa|~N}|)# zMelGSqa84)!%Qc}vij^9?#EYw#C>SKNrLZq;3l16kp}_-gi;0i4a{S7<@d!^5(%RA z^U%S@@UcT9A5H`h0|k$Jk`>r-u8T#a%Z`Z!E0}{W2M$9z!GA0h&S3MVZE&(R7p>n% zCgC<74+I@V#zf+R#utgt3A?h+&lu_=O;d&62XEMA-i9plI|AMWIw7o?{w1XYt6Rp@ z+%h<#H#&^FLAn|ztr*3o_kj_Wo(8P#dg^ZMu+Bijx#^6irc>8il`64q^S0&zkU(1O*QVlUWcf8k3HBJ;)XY7)0004nX+uL$Nkc;*aB^>EX@6{G004NLeUUv#!$25@-==Cs zDh};X#34g<5DTIrj#`BxR0y>~s}3fY{y~$5q{YQia4k6avsiU-an{wrRS*P!K%5+% z6kVjm?~+1`7!U65;l1yDx%&k&SHR1B%Wo4StZ^ep5Ck)ocD>ttSGC*=fqx#>7 zoC^*MJTq*jQ}e`OVzJP{N(Zx|sS!^RM^#Oyd?Dkq%6W^kR<5zuJ^2fRIelfB>okXu zz#^6)L4<-DN+_d>80|VK7E*K`_wWxoeu-QPxqnJv0{s+H%Yvm^=+@xR} z=zg*7k6|FN3pDGt{e5iP%@e@?3|#4Lf29G;e3D*oYtbWMU>mr&ZfnXOaJd6So($QP z9m!8q$mfCgGy0}15V{5W*4)0e&T;wxq^VcQ8{ps&7%5Qpy2rbFJNx!;O{;%DT$FO2 zFMo9fZvX%QFi=cXMa|8u{{a900RR60|K8r-|Ns9G5D=uKq;qp~Qc_a?0RR60|Nj90 z{{a900RR60|C0^%^#A|>32;bRa{vGf6951U69E94oEQKA00(qQO+^Rf1{f0uIaSDd z0ssI2rb$FWR7l6|)JqD(Fbo7xuY9u7bAMY;EgAcANPJpq`QEcYd3W$?H*8p%a^m-ePF`|*5kly2kTLw;3x4E o+5y^qz}X-SgztG>{C)pXPGz%X>6?rePXGV_07*qoM6N<$f*8#1qYj;zS-kh&JP(F7{p6lBT9nv(@M${i&7cfeOv>405 zA!CArM}&rf!;2R`cI?;z6oG+y7z0K#3%Mu)*^Eiv?k)@+tg;?J&T3B=$B>FSZ?9bB zY!2XIy^zBExk7e9UXrJ{MrlJ`$$wF;e^c&USdt{jweyGYx+g1ExJ>n08nkkc^5K2+ zHvfHmGq0gF(w{et<#vs6`h!Eurf(=`I8#$=vz#F%GsJN_ zhWVZ@jv*Cu-d-`}I&8qh8sKXcsbSm3u3XYENx4OC_r0cl4qdMUG+yL8J+rSi3|tzt zGDItV$=bJ;uj}QvF>-CT)jU(k@#>q2`i214!+V(%p6%PO!Vu}EWKbB`sf3l26x1JzY^JPR2Z7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^EyxmUpI z75nSY_>5)7_czL>oDVoz6`ud$c(*jBI%y5F^S9HFYfjfU$1_b}_>?zud2(yQrpl;Q z3mAg-$M%aht<+E7@7k2bKK*y{+Qy|K_t{r4TCdgnuF%L(x2u`Ki{XFdiQ{jd^|iR0 zO$)L$;+*l*eDZ^P-}HOgO*e?ga4PH)yuzU0Cx5cr{R6K;jf~8RcdKWwW2ob`-1M(_ jAH$9Y=ACg*>}C9y3x~_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3}-!E978JRyuD(`cUXbPA<%!0&Z;V&wi8O#SCw5X9nVF({gHim$uIO{n)DwgA;Fo3 z$;W!^xp;qRvi}Wiuw;DJTDzoPiYY>n@r335=B-nzwR5gBMsMT(Q*(CqU8V^PpGxGa zqZKu(-lU83Fle6MyH;SzqHkx!6U04Ue@@J6U9f7eX_MiC)wAw2vB+3dF|pTicj#^3 z_GsOjbH;xQ8KgOw6eO6pCU`Mi{F=b?qy6%;nhKWt40p~SY#1qYj;p~P$6!jB9L4B{oO5hcO-X(i=}MX3z#J}v=%?h0k8 zMGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1$iT3%pZiZDE0Avx;1l9{_UsxU zGa+MwgGYphfy0XzKX&Zc0Th9OdKd#nGYh#W0@;j7-tI089jvk*K+aT87srr_Id7*N zUv{lAn%J?gmZkQZ$dyMEbbhluah zTVq0X|0_-CyZY(lfft+~q!vvt>t42cmLGG4Vf9?LAMygnmpAV5{eOg6flJQ$vHadr PkkdU~{an^LB{Ts5b~SWm delta 232 zcmey!)WS4DrQRUGC&cya*){(e{zK5cd-wkT|1TgQuw==S;^N|sJN_ zhJH^M$B>FSZ>JpOY%maDd7ql8E_k^-P}k0{_n2}_ab<&u2=@;zj>nfB?k%%VWq09^ VIs2EP$Q`sf3l26xBc5BozWFmSFo>79MwA5SrR}8R%`D`i2xK!RdAqwXbg;^L06BX-T^vIy=DeM9 zkoS-QkLz3BM?!23z7A=OF6<8u{L`NB&FPQxV~?p5Cj6-`ivJxSwNdXJ1@OJK3C|-1ZW*Eqep00i_>zopr E09{&*t^fc4 delta 272 zcmbQqyqal(O1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z4BI?i978JRyq)66b=ZK1rS#Hir6^Sk_{U9_h}%qJn;M=;GKy~cu*P9S%&7-#Nwv-4VqD+;9$5H+yZjJmqprrR zo8oRZA~$x}wzn$svwE@L;*WS%sc}Qf#{K)$wmrX1TmCQme^OfGW!~|u=Ch1IFK{w= My85}Sb4q9e0A_ZC2mk;8 diff --git a/graphics/pokemon/unown/v/overworld.png b/graphics/pokemon/unown/v/overworld.png index 0bb8dba96c8ee604ff3aa40de9017de606116df2..c1fd90ff23d7ed51db049589440d237cca8d4bee 100644 GIT binary patch delta 360 zcmbQh)XY3VrJlXS)7O>#1qYj;k;QL6re6#U4B{oO5hcO-X(i=}MX3z#J}v=%?h0k8 zMGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1$iT3%pZiZDE0Avx;1l9{_UsxU zGa+MwgGYphfy0XzKX&Zc0Th9OdKd#nGYh#W0@;j7-tI089jvk*K+bYc7srr_Id7+& z=500*aJep9@l(XXiZNHJV?l$=rF!lIXM3j3Re931MOn{(@z>3%DHA-Jjx*HJefm^|2aAd#cx#^McP4DWaAiYFdmjnuy+*!b@L`xx#CA5Yvj z5?yk;pljuVNV%J-vt!blO6vEy^`AZSn4jfVzg%$Rqox0Tv$!bSHAp1?FgrQRUGC&cya*){(e{zK5cd-wkT|1TgQuw==S;^N|sJN_ zhS{Djjv*Cu-cB*(I-(%rveqUtqKK#4V20fr!9#M@zR%C8*Prm}Iv}4T*KFr%xYR>M zsMF=wlcIZ$=f!Lrrn2lU$gRzdk4}7gvn982zNgBQd97g%HE*`XH;9MSX16jN|1p2< z0R!2eTHcQT-Z<;9md@%vy+TjhG47tU%`@-m({orN9(>&K;F++B&-zE7UTE+7JM)z+ h$FuW(wRQZb#6wp_+5Z$5F$TJm!PC{xWt~$(699={bRqx% diff --git a/graphics/pokemon/unown/w/overworld.png b/graphics/pokemon/unown/w/overworld.png index d49a4cf96cb94452d43965c5f6cc87e14eefb037..8c424c88b9a1aa91f2fdce0459aa68d25c3b219d 100644 GIT binary patch delta 358 zcmeBYYGj_EQqNxE>Fdh=f`d)aSWm36?G*z9gLsK+L`iUdT1k0gQ7VJGk4u1`yFyuN zk%F##t%t9`TKsIBNx4R2N2dk_Hkh9d&#WAE}&f6)D ze9aCV3=i46Z?WH)f8znWRILO5-~ZxA;<#?7Ogu8fBr%V~G4!aj`_~Ti2ef7LjRA+LBm*MRC?_Xpe z9>2<%l(zZ4to5P`z_>|7cIHL%V;LZ?c)I$ztaD0e0sv`>fTI8a delta 243 zcmZoFSZ>Jb?H5l-?8b3`@l2dm6`9e?5(PrCKO}8AKE`=wSdzbx@xAG8SaTH*Y zKcxS=Gw$BkWJPXXrwi`QA!l;#I!On-maK^_C}Gn#e%cY(X8ZTz^X;l7OcUM&ZAwB($NJKd|hp)ElcJ9M=o5CNk*yw#Q gFWB?z{ulW$ecRaJ|K9z7fX-y_boFyt=akR{0G^0&f&c&j diff --git a/graphics/pokemon/unown/x/overworld.png b/graphics/pokemon/unown/x/overworld.png index e1621d278bd6be49e0b8f4b04d1f21761dbceecb..4de8713939353ce73e3fd8749c8713c802d9c594 100644 GIT binary patch delta 371 zcmbQq)W#1qYj;iONpVpT-Of4B{oO5hcO-X(i=}MX3z#J}v=%?h0k8 zMGD4xCWWm_9s-qcloa^617$$U8N3=a<$)ASx}&cn1H;CC?mvmFK)ykMPl)T;vul9N zgp3Ie9uXP_4liE(*s)^=Py`0*VGJ0}EaajHWHTmtySp%Su*!M>Ih#CP978JRyq$cI zx7mQlbuMp`2YZHj0*h8TV+h-e#=qeTJCE8=>b(`LYJcS6XJvcAlP-<|ERF&(ZLep4 z`d*uxdvK2B`MV4(cdDe|}?>likmw|3s;=I*JFMxlKRSJ^bt$%l%JeT%gSl#ZH%vQPow{$@M@^tlcS?83{1OUfefsJN_ zh9#aZjv*Cu-cB~;I&8q>YWg!p?Tdumnd3LT`vt0+=9s@q^HkXCIjt$~gu?#?>g+C4 zR6HlCoV?y}|I)eVbAB~#UAQ*5jQOs?sm``b+KD&s-+srj_zss(to-NBJP+o>XF2yR z_;Ou%oLhFN`sf3l26xQ_+tXPIxddFo>79MwA5SrR}8R%`D`i2xK!RdAqwXbg;^T9JI~T#WAE}&f6&m zd7BM*T<7v8d9Y`gC$MOhGlsCeX#5-Ap!{#zn`MFg9zTQl?#ut1Tw@Rz4g}Xzj~w^@ z`TdVa?SUDV{mYqjdWse?eqivq{MgR&fW~%)$Jd`0*c^0{dh+sFNR2~P?Y5iDT^;94 zFEDX2{V>yB-^gKbK!Tx_BZoC0@_v@;j!jCB*6FYqY@Wq%;hB^Kv&a8@uI%E+hxw!a v-e>IGd9t4I%H$|{<_Be0tBQS_UstKV?ah*RU)&Mw0P>rstDnm{r-UW|jCq3+ delta 259 zcmbQlJfCTTO1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z468g{978JRyq)66)oQ@wvia0W7aKQm)hm1dD4(!ze7^N`8B^!qU*b+|yJqm5X=Za0 z;c9hSc-`aG<1f{5!O|PlJhOvq8d~H0LKyfR?DqXmWY``sf3l26xGl5mp^H~@e7{p6lBT9nv(@M${i&7cfeOv11JIm^)LpEW)^Z$1hN^Eyxm(It?!vYD)f#zEIycxhCX8^OWDaV;)Vn@NHkX8VFv88`-bW zd{@fKI)n8>8Uw?IgG@|vmswbn&N;9wxGy$^)llt0{R)P6sjh;?414D|aCF4nb2x3Xw8+@1G&DMOUYp64uA80?oaF{m*7xT~(PfaSs53$nWXSBi6PN=*E8 zm!Z9#^T6AuPemE7Fcg0=33$%6p#R6x<+`cy%jFqgl=CqBcvaDS=>NvJHM8W{Z*?68 Qd62==)z4*}6H`JH0Oq5KIRF3v delta 286 zcmZ3?ypw5yO1(jVPl)T;vupk{{D+`>_wN1w|6f2rV9Amt#l^)zK|ydSIAb#J*RKo= z3`aa&978JRyq#jr$7IOkvi;M^u#V(_HEs*tWf%*aZ1pcZG}mC8#-@4s=j6&lq10Jz zAW*mT!osYHzxYHGbQ?A@)iWd9Zze#7#N(r)*ovyb?`P~xWLe1Kkq<8G~?uFcZ-kp z`TPvq&#=LsS-wwGYbP0l+XkKw1k5t From ba1512f864e17e8a623b1015f2a82afc239500ea Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 12 Aug 2024 21:52:55 +0200 Subject: [PATCH 083/225] Fix specific tiles changing to pc tiles when using boxlink/debug pc (#5141) --- include/tilesets.h | 3 +++ src/field_specials.c | 22 ++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/include/tilesets.h b/include/tilesets.h index c7cc8edac9..b495b6c52c 100644 --- a/include/tilesets.h +++ b/include/tilesets.h @@ -7,4 +7,7 @@ extern const u16 gTilesetPalettes_General[][16]; extern const struct Tileset * const gTilesetPointer_SecretBase; extern const struct Tileset * const gTilesetPointer_SecretBaseRedCave; +extern const struct Tileset gTileset_Building; +extern const struct Tileset gTileset_BrendansMaysHouse; + #endif //GUARD_tilesets_H diff --git a/src/field_specials.c b/src/field_specials.c index b44c8327aa..d1b27e2df6 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -44,6 +44,7 @@ #include "strings.h" #include "task.h" #include "text.h" +#include "tilesets.h" #include "tv.h" #include "wallclock.h" #include "window.h" @@ -969,6 +970,20 @@ void FieldShowRegionMap(void) SetMainCallback2(CB2_FieldShowRegionMap); } +static bool32 IsBuildingPCTile(u32 tileId) +{ + return gMapHeader.mapLayout->primaryTileset == &gTileset_Building && (tileId == METATILE_Building_PC_On || tileId == METATILE_Building_PC_Off); +} + +static bool32 IsPlayerHousePCTile(u32 tileId) +{ + return gMapHeader.mapLayout->secondaryTileset == &gTileset_BrendansMaysHouse + && (tileId == METATILE_BrendansMaysHouse_BrendanPC_On + || tileId == METATILE_BrendansMaysHouse_BrendanPC_Off + || tileId == METATILE_BrendansMaysHouse_MayPC_On + || tileId == METATILE_BrendansMaysHouse_MayPC_Off); +} + static bool8 IsPlayerInFrontOfPC(void) { s16 x, y; @@ -977,12 +992,7 @@ static bool8 IsPlayerInFrontOfPC(void) GetXYCoordsOneStepInFrontOfPlayer(&x, &y); tileInFront = MapGridGetMetatileIdAt(x, y); - return (tileInFront == METATILE_BrendansMaysHouse_BrendanPC_On - || tileInFront == METATILE_BrendansMaysHouse_BrendanPC_Off - || tileInFront == METATILE_BrendansMaysHouse_MayPC_On - || tileInFront == METATILE_BrendansMaysHouse_MayPC_Off - || tileInFront == METATILE_Building_PC_On - || tileInFront == METATILE_Building_PC_Off); + return IsBuildingPCTile(tileInFront) || IsPlayerHousePCTile(tileInFront); } // Task data for Task_PCTurnOnEffect and Task_LotteryCornerComputerEffect From a8cd459370c5f512bab666435c29fb61573633e6 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 12 Aug 2024 21:54:24 +0200 Subject: [PATCH 084/225] Fixes Purifying Salt not halving dmg for dynamic move types (#5145) * Fixes Purifying Salt not halving dmg for dynamic move types * forgot to add --- src/battle_util.c | 11 +++++++---- test/battle/ability/purifying_salt.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index e517a81605..3be34d1afc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8257,6 +8257,8 @@ u32 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u32 moveTarget, side; + u32 moveType; + GET_MOVE_TYPE(move, moveType); if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; @@ -8274,7 +8276,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) else { targetBattler = SetRandomTarget(gBattlerAttacker); - if (gMovesInfo[move].type == TYPE_ELECTRIC + if (moveType == TYPE_ELECTRIC && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD) { @@ -8282,7 +8284,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; } - else if (gMovesInfo[move].type == TYPE_WATER + else if (moveType == TYPE_WATER && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN) { @@ -9771,7 +9773,7 @@ static inline u32 CalcDefenseStat(u32 move, u32 battlerAtk, u32 battlerDef, u32 modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_PURIFYING_SALT: - if (gMovesInfo[move].type == TYPE_GHOST) + if (moveType == TYPE_GHOST) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; } @@ -10467,7 +10469,8 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); - u8 moveType = gMovesInfo[move].type; + u32 moveType; + GET_MOVE_TYPE(move, moveType); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index e188262497..4c25321e5f 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -19,6 +19,24 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam } } +SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", s16 damage) +{ + u16 ability; + PARAMETRIZE { ability = ABILITY_STURDY; } + PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST); + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_GHOST); } + OPPONENT(SPECIES_GARGANACL) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage); + } +} + SINGLE_BATTLE_TEST("Purifying Salt makes Rest fail") { GIVEN { From c74ad262cb5e6a2267e0115a3554e8b4181f2c8e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 12 Aug 2024 16:32:11 -0400 Subject: [PATCH 085/225] Fixed incoming usage of GET_MOVE_TYPE from master --- src/battle_util.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index adcb745c7b..9da592b09f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8256,8 +8256,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u32 moveTarget, side; - u32 moveType; - GET_MOVE_TYPE(move, moveType); + u32 moveType = GetMoveType(move); if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; @@ -10468,8 +10467,7 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); - u32 moveType; - GET_MOVE_TYPE(move, moveType); + u32 moveType = GetMoveType(move); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { From f18859ac331c5356ac8ad4895729640ac9fa2b11 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Mon, 12 Aug 2024 23:07:12 -0400 Subject: [PATCH 086/225] Refactor Frontier Brains (#5027) * Created gFrontierBrainInfo with trainerId * Added objEventGfx and isFemale * Added win/loss texts * Added battleBit and streakAppearances * Added macro for texts * Added macro for sprites --- src/frontier_util.c | 218 ++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 121 deletions(-) diff --git a/src/frontier_util.c b/src/frontier_util.c index ca8c76a0fd..7cadbf364b 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -49,6 +49,17 @@ struct FrontierBrainMon u16 moves[MAX_MON_MOVES]; }; +struct FrontierBrain +{ + u16 trainerId; + u8 objEventGfx; + u8 isFemale; + const u8 *lostTexts[2]; + const u8 *wonTexts[2]; + u16 battledBit[2]; + u8 streakAppearances[4]; +}; + // This file's functions. static void GetChallengeStatus(void); static void GetFrontierData(void); @@ -83,16 +94,74 @@ static void ShowPyramidResultsWindow(void); static void ShowLinkContestResultsWindow(void); static void CopyFrontierBrainText(bool8 playerWonText); -// const rom data -static const u8 sFrontierBrainStreakAppearances[NUM_FRONTIER_FACILITIES][4] = +#define FRONTIER_BRAIN_SPRITES(Brain) \ + .trainerId = TRAINER_##Brain, \ + .objEventGfx = OBJ_EVENT_GFX_##Brain + +#define FRONTIER_BRAIN_TEXTS(Brain) \ + .lostTexts = {gText_##Brain##DefeatSilver, gText_##Brain##DefeatGold}, \ + .wonTexts = {gText_##Brain##WonSilver, gText_##Brain##WonGold} + +// battledBit: Flags to change the conversation when the Frontier Brain is encountered for a battle +// First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol) +const struct FrontierBrain gFrontierBrainInfo[NUM_FRONTIER_FACILITIES] = { - [FRONTIER_FACILITY_TOWER] = {35, 70, 35, 1}, - [FRONTIER_FACILITY_DOME] = { 4, 9, 5, 0}, - [FRONTIER_FACILITY_PALACE] = {21, 42, 21, 1}, - [FRONTIER_FACILITY_ARENA] = {28, 56, 28, 1}, - [FRONTIER_FACILITY_FACTORY] = {21, 42, 21, 1}, - [FRONTIER_FACILITY_PIKE] = {28, 140, 56, 1}, - [FRONTIER_FACILITY_PYRAMID] = {21, 70, 35, 0}, + [FRONTIER_FACILITY_TOWER] = + { + FRONTIER_BRAIN_SPRITES(ANABEL), + .isFemale = TRUE, + FRONTIER_BRAIN_TEXTS(Anabel), + .battledBit = {1 << 0, 1 << 1}, + .streakAppearances = {35, 70, 35, 1}, + }, + [FRONTIER_FACILITY_DOME] = + { + FRONTIER_BRAIN_SPRITES(TUCKER), + .isFemale = FALSE, + FRONTIER_BRAIN_TEXTS(Tucker), + .battledBit = {1 << 2, 1 << 3}, + .streakAppearances = {1, 2, 5, 0}, + }, + [FRONTIER_FACILITY_PALACE] = + { + FRONTIER_BRAIN_SPRITES(SPENSER), + .isFemale = FALSE, + FRONTIER_BRAIN_TEXTS(Spenser), + .battledBit = {1 << 4, 1 << 5}, + .streakAppearances = {21, 42, 21, 1}, + }, + [FRONTIER_FACILITY_ARENA] = + { + FRONTIER_BRAIN_SPRITES(GRETA), + .isFemale = TRUE, + FRONTIER_BRAIN_TEXTS(Greta), + .battledBit = {1 << 6, 1 << 7}, + .streakAppearances = {28, 56, 28, 1}, + }, + [FRONTIER_FACILITY_FACTORY] = + { + FRONTIER_BRAIN_SPRITES(NOLAND), + .isFemale = FALSE, + FRONTIER_BRAIN_TEXTS(Noland), + .battledBit = {1 << 8, 1 << 9}, + .streakAppearances = {21, 42, 21, 1}, + }, + [FRONTIER_FACILITY_PIKE] = + { + FRONTIER_BRAIN_SPRITES(LUCY), + .isFemale = TRUE, + FRONTIER_BRAIN_TEXTS(Lucy), + .battledBit = {1 << 10, 1 << 11}, + .streakAppearances = {28, 140, 56, 1}, + }, + [FRONTIER_FACILITY_PYRAMID] = + { + FRONTIER_BRAIN_SPRITES(BRANDON), + .isFemale = FALSE, + FRONTIER_BRAIN_TEXTS(Brandon), + .battledBit = {1 << 12, 1 << 13}, + .streakAppearances = {21, 70, 35, 0}, + }, }; static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZE] = @@ -537,20 +606,6 @@ static const u8 sBattlePointAwards[NUM_FRONTIER_FACILITIES][FRONTIER_MODE_COUNT] }, }; - -// Flags to change the conversation when the Frontier Brain is encountered for a battle -// First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol) -static const u16 sBattledBrainBitFlags[NUM_FRONTIER_FACILITIES][2] = -{ - [FRONTIER_FACILITY_TOWER] = {1 << 0, 1 << 1}, - [FRONTIER_FACILITY_DOME] = {1 << 2, 1 << 3}, - [FRONTIER_FACILITY_PALACE] = {1 << 4, 1 << 5}, - [FRONTIER_FACILITY_ARENA] = {1 << 6, 1 << 7}, - [FRONTIER_FACILITY_FACTORY] = {1 << 8, 1 << 9}, - [FRONTIER_FACILITY_PIKE] = {1 << 10, 1 << 11}, - [FRONTIER_FACILITY_PYRAMID] = {1 << 12, 1 << 13}, -}; - static void (* const sFrontierUtilFuncs[])(void) = { [FRONTIER_UTIL_FUNC_GET_STATUS] = GetChallengeStatus, @@ -611,18 +666,6 @@ static const struct WindowTemplate sRankingHallRecordsWindowTemplate = .baseBlock = 1 }; -// Second field - whether the character is female. -static const u8 sFrontierBrainObjEventGfx[NUM_FRONTIER_FACILITIES][2] = -{ - [FRONTIER_FACILITY_TOWER] = {OBJ_EVENT_GFX_ANABEL, TRUE}, - [FRONTIER_FACILITY_DOME] = {OBJ_EVENT_GFX_TUCKER, FALSE}, - [FRONTIER_FACILITY_PALACE] = {OBJ_EVENT_GFX_SPENSER, FALSE}, - [FRONTIER_FACILITY_ARENA] = {OBJ_EVENT_GFX_GRETA, TRUE}, - [FRONTIER_FACILITY_FACTORY] = {OBJ_EVENT_GFX_NOLAND, FALSE}, - [FRONTIER_FACILITY_PIKE] = {OBJ_EVENT_GFX_LUCY, TRUE}, - [FRONTIER_FACILITY_PYRAMID] = {OBJ_EVENT_GFX_BRANDON, FALSE}, -}; - static const u8 *const sRecordsWindowChallengeTexts[][2] = { [RANKING_HALL_TOWER_SINGLES] = {gText_BattleTower2, gText_FacilitySingle}, @@ -657,73 +700,6 @@ static const u8 *const sHallFacilityToRecordsText[] = [RANKING_HALL_TOWER_LINK] = gText_FrontierFacilityWinStreak, }; -static const u16 sFrontierBrainTrainerIds[NUM_FRONTIER_FACILITIES] = -{ - [FRONTIER_FACILITY_TOWER] = TRAINER_ANABEL, - [FRONTIER_FACILITY_DOME] = TRAINER_TUCKER, - [FRONTIER_FACILITY_PALACE] = TRAINER_SPENSER, - [FRONTIER_FACILITY_ARENA] = TRAINER_GRETA, - [FRONTIER_FACILITY_FACTORY] = TRAINER_NOLAND, - [FRONTIER_FACILITY_PIKE] = TRAINER_LUCY, - [FRONTIER_FACILITY_PYRAMID] = TRAINER_BRANDON, -}; - -static const u8 *const sFrontierBrainPlayerLostSilverTexts[NUM_FRONTIER_FACILITIES] = -{ - [FRONTIER_FACILITY_TOWER] = gText_AnabelWonSilver, - [FRONTIER_FACILITY_DOME] = gText_TuckerWonSilver, - [FRONTIER_FACILITY_PALACE] = gText_SpenserWonSilver, - [FRONTIER_FACILITY_ARENA] = gText_GretaWonSilver, - [FRONTIER_FACILITY_FACTORY] = gText_NolandWonSilver, - [FRONTIER_FACILITY_PIKE] = gText_LucyWonSilver, - [FRONTIER_FACILITY_PYRAMID] = gText_BrandonWonSilver, -}; - -static const u8 *const sFrontierBrainPlayerWonSilverTexts[NUM_FRONTIER_FACILITIES] = -{ - [FRONTIER_FACILITY_TOWER] = gText_AnabelDefeatSilver, - [FRONTIER_FACILITY_DOME] = gText_TuckerDefeatSilver, - [FRONTIER_FACILITY_PALACE] = gText_SpenserDefeatSilver, - [FRONTIER_FACILITY_ARENA] = gText_GretaDefeatSilver, - [FRONTIER_FACILITY_FACTORY] = gText_NolandDefeatSilver, - [FRONTIER_FACILITY_PIKE] = gText_LucyDefeatSilver, - [FRONTIER_FACILITY_PYRAMID] = gText_BrandonDefeatSilver, -}; - -static const u8 *const sFrontierBrainPlayerLostGoldTexts[NUM_FRONTIER_FACILITIES] = -{ - [FRONTIER_FACILITY_TOWER] = gText_AnabelWonGold, - [FRONTIER_FACILITY_DOME] = gText_TuckerWonGold, - [FRONTIER_FACILITY_PALACE] = gText_SpenserWonGold, - [FRONTIER_FACILITY_ARENA] = gText_GretaWonGold, - [FRONTIER_FACILITY_FACTORY] = gText_NolandWonGold, - [FRONTIER_FACILITY_PIKE] = gText_LucyWonGold, - [FRONTIER_FACILITY_PYRAMID] = gText_BrandonWonGold, -}; - -static const u8 *const sFrontierBrainPlayerWonGoldTexts[NUM_FRONTIER_FACILITIES] = -{ - [FRONTIER_FACILITY_TOWER] = gText_AnabelDefeatGold, - [FRONTIER_FACILITY_DOME] = gText_TuckerDefeatGold, - [FRONTIER_FACILITY_PALACE] = gText_SpenserDefeatGold, - [FRONTIER_FACILITY_ARENA] = gText_GretaDefeatGold, - [FRONTIER_FACILITY_FACTORY] = gText_NolandDefeatGold, - [FRONTIER_FACILITY_PIKE] = gText_LucyDefeatGold, - [FRONTIER_FACILITY_PYRAMID] = gText_BrandonDefeatGold, -}; - -static const u8 *const *const sFrontierBrainPlayerLostTexts[] = -{ - sFrontierBrainPlayerLostSilverTexts, - sFrontierBrainPlayerLostGoldTexts, -}; - -static const u8 *const *const sFrontierBrainPlayerWonTexts[] = -{ - sFrontierBrainPlayerWonSilverTexts, - sFrontierBrainPlayerWonGoldTexts, -}; - // code void CallFrontierUtilFunc(void) { @@ -785,7 +761,7 @@ static void GetFrontierData(void) gSpecialVar_Result = gSaveBlock2Ptr->frontier.disableRecordBattle; break; case FRONTIER_DATA_HEARD_BRAIN_SPEECH: - gSpecialVar_Result = gSaveBlock2Ptr->frontier.battledBrainFlags & sBattledBrainBitFlags[facility][hasSymbol]; + gSpecialVar_Result = gSaveBlock2Ptr->frontier.battledBrainFlags & gFrontierBrainInfo[facility].battledBit[hasSymbol]; break; } } @@ -820,7 +796,7 @@ static void SetFrontierData(void) gSaveBlock2Ptr->frontier.disableRecordBattle = gSpecialVar_0x8006; break; case FRONTIER_DATA_HEARD_BRAIN_SPEECH: - gSaveBlock2Ptr->frontier.battledBrainFlags |= sBattledBrainBitFlags[facility][hasSymbol]; + gSaveBlock2Ptr->frontier.battledBrainFlags |= gFrontierBrainInfo[facility].battledBit[hasSymbol]; break; } } @@ -1600,7 +1576,7 @@ u8 GetFrontierBrainStatus(void) s32 facility = VarGet(VAR_FRONTIER_FACILITY); s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u16 winStreakNoModifier = GetCurrentFacilityWinStreak(); - s32 winStreak = winStreakNoModifier + sFrontierBrainStreakAppearances[facility][3]; + s32 winStreak = winStreakNoModifier + gFrontierBrainInfo[facility].streakAppearances[3]; s32 symbolsCount; if (battleMode != FRONTIER_MODE_SINGLES) @@ -1612,20 +1588,20 @@ u8 GetFrontierBrainStatus(void) // Missing a symbol case 0: case 1: - if (winStreak == sFrontierBrainStreakAppearances[facility][symbolsCount]) + if (winStreak == gFrontierBrainInfo[facility].streakAppearances[symbolsCount]) status = symbolsCount + 1; // FRONTIER_BRAIN_SILVER and FRONTIER_BRAIN_GOLD break; // Already received both symbols case 2: default: // Silver streak is reached - if (winStreak == sFrontierBrainStreakAppearances[facility][0]) + if (winStreak == gFrontierBrainInfo[facility].streakAppearances[0]) status = FRONTIER_BRAIN_STREAK; // Gold streak is reached - else if (winStreak == sFrontierBrainStreakAppearances[facility][1]) + else if (winStreak == gFrontierBrainInfo[facility].streakAppearances[1]) status = FRONTIER_BRAIN_STREAK_LONG; // Some increment of the gold streak is reached - else if (winStreak > sFrontierBrainStreakAppearances[facility][1] && (winStreak - sFrontierBrainStreakAppearances[facility][1]) % sFrontierBrainStreakAppearances[facility][2] == 0) + else if (winStreak > gFrontierBrainInfo[facility].streakAppearances[1] && (winStreak - gFrontierBrainInfo[facility].streakAppearances[1]) % gFrontierBrainInfo[facility].streakAppearances[2] == 0) status = FRONTIER_BRAIN_STREAK_LONG; break; } @@ -2396,7 +2372,7 @@ u8 GetFrontierBrainTrainerPicIndex(void) else facility = VarGet(VAR_FRONTIER_FACILITY); - return GetTrainerPicFromId(sFrontierBrainTrainerIds[facility]); + return GetTrainerPicFromId(gFrontierBrainInfo[facility].trainerId); } u8 GetFrontierBrainTrainerClass(void) @@ -2408,7 +2384,7 @@ u8 GetFrontierBrainTrainerClass(void) else facility = VarGet(VAR_FRONTIER_FACILITY); - return GetTrainerClassFromId(sFrontierBrainTrainerIds[facility]); + return GetTrainerClassFromId(gFrontierBrainInfo[facility].trainerId); } void CopyFrontierBrainTrainerName(u8 *dst) @@ -2422,7 +2398,7 @@ void CopyFrontierBrainTrainerName(u8 *dst) else facility = VarGet(VAR_FRONTIER_FACILITY); - trainerName = GetTrainerNameFromId(sFrontierBrainTrainerIds[facility]); + trainerName = GetTrainerNameFromId(gFrontierBrainInfo[facility].trainerId); for (i = 0; i < PLAYER_NAME_LENGTH; i++) dst[i] = trainerName[i]; @@ -2432,13 +2408,13 @@ void CopyFrontierBrainTrainerName(u8 *dst) bool8 IsFrontierBrainFemale(void) { s32 facility = VarGet(VAR_FRONTIER_FACILITY); - return sFrontierBrainObjEventGfx[facility][1]; + return gFrontierBrainInfo[facility].isFemale; } void SetFrontierBrainObjEventGfx_2(void) { s32 facility = VarGet(VAR_FRONTIER_FACILITY); - VarSet(VAR_OBJ_GFX_ID_0, sFrontierBrainObjEventGfx[facility][0]); + VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx); } #define FRONTIER_BRAIN_OTID 61226 @@ -2505,7 +2481,7 @@ u16 GetFrontierBrainMonSpecies(u8 monId) void SetFrontierBrainObjEventGfx(u8 facility) { gTrainerBattleOpponent_A = TRAINER_FRONTIER_BRAIN; - VarSet(VAR_OBJ_GFX_ID_0, sFrontierBrainObjEventGfx[facility][0]); + VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx); } u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId) @@ -2540,12 +2516,12 @@ s32 GetFronterBrainSymbol(void) if (symbol == 2) { u16 winStreak = GetCurrentFacilityWinStreak(); - if (winStreak + sFrontierBrainStreakAppearances[facility][3] == sFrontierBrainStreakAppearances[facility][0]) + if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] == gFrontierBrainInfo[facility].streakAppearances[0]) symbol = 0; - else if (winStreak + sFrontierBrainStreakAppearances[facility][3] == sFrontierBrainStreakAppearances[facility][1]) + else if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] == gFrontierBrainInfo[facility].streakAppearances[1]) symbol = 1; - else if (winStreak + sFrontierBrainStreakAppearances[facility][3] > sFrontierBrainStreakAppearances[facility][1] - && (winStreak + sFrontierBrainStreakAppearances[facility][3] - sFrontierBrainStreakAppearances[facility][1]) % sFrontierBrainStreakAppearances[facility][2] == 0) + else if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] > gFrontierBrainInfo[facility].streakAppearances[1] + && (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] - gFrontierBrainInfo[facility].streakAppearances[1]) % gFrontierBrainInfo[facility].streakAppearances[2] == 0) symbol = 1; } return symbol; @@ -2571,10 +2547,10 @@ static void CopyFrontierBrainText(bool8 playerWonText) switch (playerWonText) { case FALSE: - StringCopy(gStringVar4, sFrontierBrainPlayerLostTexts[symbol][facility]); + StringCopy(gStringVar4, gFrontierBrainInfo[facility].wonTexts[symbol]); break; case TRUE: - StringCopy(gStringVar4, sFrontierBrainPlayerWonTexts[symbol][facility]); + StringCopy(gStringVar4, gFrontierBrainInfo[facility].lostTexts[symbol]); break; } } From a3d5f54b7588d6b5b3125c6c61356dcc0123b544 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 1 Jul 2024 15:51:15 -0400 Subject: [PATCH 087/225] Fix type for offset in MapConnection --- include/global.fieldmap.h | 2 +- src/fieldmap.c | 2 +- src/item_use.c | 45 ++++++++++++++++++--------------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 7461929c3a..c7a4133ea8 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -131,7 +131,7 @@ struct MapEvents struct MapConnection { u8 direction; - u32 offset; + s32 offset; u8 mapGroup; u8 mapNum; }; diff --git a/src/fieldmap.c b/src/fieldmap.c index d9c4fa371a..5fdc4cbfb7 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -144,7 +144,7 @@ static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader) for (i = 0; i < count; i++, connection++) { struct MapHeader const *cMap = GetMapHeaderFromConnection(connection); - u32 offset = connection->offset; + s32 offset = connection->offset; switch (connection->direction) { case CONNECTION_SOUTH: diff --git a/src/item_use.c b/src/item_use.c index 60338e437a..abd80e0eae 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -393,46 +393,43 @@ static bool8 IsHiddenItemPresentAtCoords(const struct MapEvents *events, s16 x, static bool8 IsHiddenItemPresentInConnection(const struct MapConnection *connection, int x, int y) { + s16 connectionX, connectionY; + struct MapHeader const *const connectionHeader = GetMapHeaderFromConnection(connection); - u16 localX, localY; - u32 localOffset; - s32 localLength; - - struct MapHeader const *const mapHeader = GetMapHeaderFromConnection(connection); - +// To convert our x/y into coordinates that are relative to the connected map, we must: +// - Subtract the virtual offset used for the border buffer (MAP_OFFSET). +// - Subtract the horizontal offset between North/South connections, or the vertical offset for East/West +// - Account for map size. (0,0) is in the NW corner of our map, so when looking North/West we have to add the height/width of the connected map, +// and when looking South/East we have to subtract the height/width of our current map. +#define localX (x - MAP_OFFSET) +#define localY (y - MAP_OFFSET) switch (connection->direction) { - // same weird temp variable behavior seen in IsHiddenItemPresentAtCoords case CONNECTION_NORTH: - localOffset = connection->offset + MAP_OFFSET; - localX = x - localOffset; - localLength = mapHeader->mapLayout->height - MAP_OFFSET; - localY = localLength + y; // additions are reversed for some reason + connectionX = localX - connection->offset; + connectionY = connectionHeader->mapLayout->height + localY; break; case CONNECTION_SOUTH: - localOffset = connection->offset + MAP_OFFSET; - localX = x - localOffset; - localLength = gMapHeader.mapLayout->height + MAP_OFFSET; - localY = y - localLength; + connectionX = localX - connection->offset; + connectionY = localY - gMapHeader.mapLayout->height; break; case CONNECTION_WEST: - localLength = mapHeader->mapLayout->width - MAP_OFFSET; - localX = localLength + x; // additions are reversed for some reason - localOffset = connection->offset + MAP_OFFSET; - localY = y - localOffset; + connectionX = connectionHeader->mapLayout->width + localX; + connectionY = localY - connection->offset; break; case CONNECTION_EAST: - localLength = gMapHeader.mapLayout->width + MAP_OFFSET; - localX = x - localLength; - localOffset = connection->offset + MAP_OFFSET; - localY = y - localOffset; + connectionX = localX - gMapHeader.mapLayout->width; + connectionY = localY - connection->offset; break; default: return FALSE; } - return IsHiddenItemPresentAtCoords(mapHeader->events, localX, localY); + return IsHiddenItemPresentAtCoords(connectionHeader->events, connectionX, connectionY); } +#undef localX +#undef localY + static void CheckForHiddenItemsInMapConnection(u8 taskId) { s16 playerX, playerY; From cfa7316ea04f37a21833b3a0b5f5f1b38476cb9b Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 13 Aug 2024 22:08:24 +0200 Subject: [PATCH 088/225] Made the speed tie test use PASSES_RANDOMLY (#5092) * Made the speed tie test use PASSES_RANDOMLY * Hack to allow results with PASSES_RANDOMLY --------- Co-authored-by: Hedara Co-authored-by: Martin Griffin --- test/battle/move.c | 90 +++++++++++++++++++-------------------- test/test_runner_battle.c | 5 ++- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/test/battle/move.c b/test/battle/move.c index 228a09a7c6..081a91712d 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -80,57 +80,57 @@ SINGLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie } } -DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie [doubles]") +DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie [doubles]", u32 permutations) { - struct BattlePokemon *order[4] = { NULL, NULL, NULL, NULL }; - u32 a, b, c, d; - - // TODO: Test all of these in a single PASSES_RANDOMLY pass rather - // than 24 PARAMETRIZEd passes. - PARAMETRIZE { a = 0; b = 1; c = 2; d = 3; } - PARAMETRIZE { a = 0; b = 1; c = 3; d = 2; } - PARAMETRIZE { a = 0; b = 2; c = 1; d = 3; } - PARAMETRIZE { a = 0; b = 2; c = 3; d = 1; } - PARAMETRIZE { a = 0; b = 3; c = 1; d = 2; } - PARAMETRIZE { a = 0; b = 3; c = 2; d = 1; } - PARAMETRIZE { a = 1; b = 0; c = 2; d = 3; } - PARAMETRIZE { a = 1; b = 0; c = 3; d = 2; } - PARAMETRIZE { a = 1; b = 2; c = 0; d = 3; } - PARAMETRIZE { a = 1; b = 2; c = 3; d = 0; } - PARAMETRIZE { a = 1; b = 3; c = 0; d = 2; } - PARAMETRIZE { a = 1; b = 3; c = 2; d = 0; } - PARAMETRIZE { a = 2; b = 0; c = 1; d = 3; } - PARAMETRIZE { a = 2; b = 0; c = 3; d = 1; } - PARAMETRIZE { a = 2; b = 1; c = 0; d = 3; } - PARAMETRIZE { a = 2; b = 1; c = 3; d = 0; } - PARAMETRIZE { a = 2; b = 3; c = 0; d = 1; } - PARAMETRIZE { a = 2; b = 3; c = 1; d = 0; } - PARAMETRIZE { a = 3; b = 0; c = 1; d = 2; } - PARAMETRIZE { a = 3; b = 0; c = 2; d = 1; } - PARAMETRIZE { a = 3; b = 1; c = 0; d = 2; } - PARAMETRIZE { a = 3; b = 1; c = 2; d = 0; } - PARAMETRIZE { a = 3; b = 2; c = 0; d = 1; } - PARAMETRIZE { a = 3; b = 2; c = 1; d = 0; } - - order[a] = playerLeft; - order[b] = playerRight; - order[c] = opponentLeft; - order[d] = opponentRight; - - PASSES_RANDOMLY(1, 24, RNG_SPEED_TIE); + PARAMETRIZE {} // Hack to make permutations legal. + PASSES_RANDOMLY(24, 24, RNG_SPEED_TIE); + ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); + ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING); + ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP); + ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } PLAYER(SPECIES_WYNAUT) { Speed(1); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); } OPPONENT(SPECIES_WYNAUT) { Speed(1); } } WHEN { - TURN { MOVE(playerLeft, MOVE_SPLASH); MOVE(playerRight, MOVE_SPLASH); MOVE(opponentLeft, MOVE_SPLASH); MOVE(opponentRight, MOVE_SPLASH); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[0]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[1]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[2]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[3]); + TURN { MOVE(playerLeft, MOVE_ENDEAVOR, target: opponentLeft); MOVE(playerRight, MOVE_LIFE_DEW); MOVE(opponentLeft, MOVE_CRUSH_GRIP, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 0)); MOVE(opponentRight, MOVE_SUPER_FANG, target: playerLeft); } + } THEN { + // This tests for unique combinatins of HP values depending on which order the moves are executed in + // The unique outcomes arise from the specific attacks and HP, Def, and Atk values chosen + // The switch is then set up in such a way that the only way for this test to pass exactly one is for each HP combination to occur exactly once +#define HP_PAIR(a, b) ((a) * 1000 + (b)) + switch (HP_PAIR(playerLeft->hp, opponentLeft->hp)) + { + case HP_PAIR(188, 360): results[i].permutations += 1 << 0; break; + case HP_PAIR(189, 360): results[i].permutations += 1 << 1; break; + case HP_PAIR(261, 360): results[i].permutations += 1 << 2; break; + case HP_PAIR(235, 360): results[i].permutations += 1 << 3; break; + case HP_PAIR(262, 360): results[i].permutations += 1 << 4; break; + case HP_PAIR(202, 360): results[i].permutations += 1 << 5; break; + case HP_PAIR(189, 378): results[i].permutations += 1 << 6; break; + case HP_PAIR(189, 189): results[i].permutations += 1 << 7; break; + case HP_PAIR(189, 480): results[i].permutations += 1 << 8; break; + case HP_PAIR(188, 480): results[i].permutations += 1 << 9; break; + case HP_PAIR(188, 240): results[i].permutations += 1 << 10; break; + case HP_PAIR(188, 188): results[i].permutations += 1 << 11; break; + case HP_PAIR(262, 262): results[i].permutations += 1 << 12; break; + case HP_PAIR(262, 142): results[i].permutations += 1 << 13; break; + case HP_PAIR(202, 403): results[i].permutations += 1 << 14; break; + case HP_PAIR(202, 202): results[i].permutations += 1 << 15; break; + case HP_PAIR(262, 283): results[i].permutations += 1 << 16; break; + case HP_PAIR(202, 283): results[i].permutations += 1 << 17; break; + case HP_PAIR(235, 180): results[i].permutations += 1 << 18; break; + case HP_PAIR(261, 180): results[i].permutations += 1 << 19; break; + case HP_PAIR(235, 235): results[i].permutations += 1 << 20; break; + case HP_PAIR(235, 300): results[i].permutations += 1 << 21; break; + case HP_PAIR(261, 141): results[i].permutations += 1 << 22; break; + case HP_PAIR(261, 261): results[i].permutations += 1 << 23; break; + } +#undef HP_PAIR + } FINALLY { + EXPECT_EQ(results[i].permutations, (1 << 24) - 1); } } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 11432bd12b..92789710f7 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1327,7 +1327,7 @@ void TestRunner_Battle_AfterLastTurn(void) } STATE->runThen = TRUE; - STATE->runFinally = STATE->runParameter + 1 == STATE->parameters; + STATE->runFinally = STATE->runParameter + 1 == STATE->parameters && STATE->runTrial + 1 >= STATE->trials; InvokeTestFunction(test); STATE->runThen = FALSE; STATE->runFinally = FALSE; @@ -1369,6 +1369,7 @@ static inline rng_value_t MakeRngValue(const u16 seed) return ISO_RANDOMIZE1(seed); #endif } + static void CB2_BattleTest_NextTrial(void) { ClearFlagAfterTest(); @@ -1452,7 +1453,7 @@ void Randomly(u32 sourceLine, u32 passes, u32 trials, struct RandomlyContext ctx { const struct BattleTest *test = GetBattleTest(); INVALID_IF(STATE->trials != 0, "PASSES_RANDOMLY can only be used once per test"); - INVALID_IF(test->resultsSize > 0, "PASSES_RANDOMLY is incompatible with results"); + INVALID_IF(test->resultsSize > 0 && STATE->parametersCount > 1, "PASSES_RANDOMLY is incompatible with results"); INVALID_IF(passes > trials, "%d passes specified, but only %d trials", passes, trials); STATE->rngTag = ctx.tag; STATE->rngTrialOffset = 0; From 38752b59b42235e020cd32624d36107a2588352a Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:42:39 -0700 Subject: [PATCH 089/225] Fix a sprite issue with B_SHOW_TYPES (#5157) * Fixed issue where tiles were not freed * Updated to destroy first * Cleaned up returns * Added typeIconTags Added FreeAllTypeIconResources Fixed issue where typeIcons were not being properly handled when hidden --- src/type_icons.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/type_icons.c b/src/type_icons.c index a36c347775..2877d22071 100644 --- a/src/type_icons.c +++ b/src/type_icons.c @@ -28,6 +28,7 @@ static bool32 ShouldFlipTypeIcon(bool32, u32, u32); static void SpriteCB_TypeIcon(struct Sprite*); static void DestroyTypeIcon(struct Sprite*); +static void FreeAllTypeIconResources(void); static bool32 ShouldHideTypeIcon(u32); static s32 GetTypeIconHideMovement(bool32, u32); static s32 GetTypeIconSlideMovement(bool32, u32, s32); @@ -429,22 +430,45 @@ static void SpriteCB_TypeIcon(struct Sprite* sprite) sprite->y = GetTypeIconBounceMovement(sprite->tVerticalPosition,position); } +static const u32 typeIconTags[] = +{ + TYPE_ICON_TAG, + TYPE_ICON_TAG_2 +}; + static void DestroyTypeIcon(struct Sprite* sprite) { - u32 i; + u32 spriteId, tag; + DestroySpriteAndFreeResources(sprite); - for (i = 0; i < MAX_SPRITES; ++i) + for (spriteId = 0; spriteId < MAX_SPRITES; ++spriteId) { - if (!gSprites[i].inUse) + if (!gSprites[spriteId].inUse) continue; - if (gSprites[i].template->paletteTag == TYPE_ICON_TAG) - return; + for (tag = 0; tag < 2; tag++) + { + if (gSprites[spriteId].template->paletteTag == typeIconTags[tag]) + return; + + if (gSprites[spriteId].template->tileTag == typeIconTags[tag]) + return; + } } - FreeSpritePaletteByTag(TYPE_ICON_TAG); - FreeSpritePaletteByTag(TYPE_ICON_TAG_2); + FreeAllTypeIconResources(); +} + +static void FreeAllTypeIconResources(void) +{ + u32 tag; + + for (tag = 0; tag < 2; tag++) + { + FreeSpriteTilesByTag(typeIconTags[tag]); + FreeSpritePaletteByTag(typeIconTags[tag]); + } } static bool32 ShouldHideTypeIcon(u32 battlerId) From 7119d60a6748c3f6a899d602f3eed7b239ee8753 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 14 Aug 2024 15:31:26 +0200 Subject: [PATCH 090/225] Set new anim particles by default to off (#5161) --- include/config/battle.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index d867a223d9..1cb4a4a6ce 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -251,22 +251,22 @@ #define B_TRY_CATCH_TRAINER_BALL GEN_LATEST // In Gen4+, trying to catch a Trainer's Pokémon does not consume the Poké Ball. // Animation Settings -#define B_NEW_SWORD_PARTICLE TRUE // If set to TRUE, it updates Swords Dance's particle. -#define B_NEW_LEECH_SEED_PARTICLE TRUE // If set to TRUE, it updates Leech Seed's animation particle. -#define B_NEW_HORN_ATTACK_PARTICLE TRUE // If set to TRUE, it updates Horn Attack's horn particle. -#define B_NEW_ROCKS_PARTICLE TRUE // If set to TRUE, it updates rock particles. -#define B_NEW_LEAF_PARTICLE TRUE // If set to TRUE, it updates leaf particle. -#define B_NEW_EMBER_PARTICLES TRUE // If set to TRUE, it updates Ember's fire particle. -#define B_NEW_MEAN_LOOK_PARTICLE TRUE // If set to TRUE, it updates Mean Look's eye particle. -#define B_NEW_TEETH_PARTICLE TRUE // If set to TRUE, it updates Bite/Crunch teeth particle. -#define B_NEW_HANDS_FEET_PARTICLE TRUE // If set to TRUE, it updates chop/kick/punch particles. -#define B_NEW_SPIKES_PARTICLE TRUE // If set to TRUE, it updates Spikes particle. -#define B_NEW_FLY_BUBBLE_PARTICLE TRUE // If set to TRUE, it updates Fly's 'bubble' particle. -#define B_NEW_CURSE_NAIL_PARTICLE TRUE // If set to TRUE, it updates Curse's nail. -#define B_NEW_BATON_PASS_BALL_PARTICLE TRUE // If set to TRUE, it updates Baton Pass' Poké Ball sprite. -#define B_NEW_MORNING_SUN_STAR_PARTICLE TRUE // If set to TRUE, it updates Morning Sun's star particles. -#define B_NEW_IMPACT_PALETTE TRUE // If set to TRUE, it updates the basic 'hit' palette. -#define B_NEW_SURF_PARTICLE_PALETTE TRUE // If set to TRUE, it updates Surf's wave palette. +#define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. +#define B_NEW_LEECH_SEED_PARTICLE FALSE // If set to TRUE, it updates Leech Seed's animation particle. +#define B_NEW_HORN_ATTACK_PARTICLE FALSE // If set to TRUE, it updates Horn Attack's horn particle. +#define B_NEW_ROCKS_PARTICLE FALSE // If set to TRUE, it updates rock particles. +#define B_NEW_LEAF_PARTICLE FALSE // If set to TRUE, it updates leaf particle. +#define B_NEW_EMBER_PARTICLES FALSE // If set to TRUE, it updates Ember's fire particle. +#define B_NEW_MEAN_LOOK_PARTICLE FALSE // If set to TRUE, it updates Mean Look's eye particle. +#define B_NEW_TEETH_PARTICLE FALSE // If set to TRUE, it updates Bite/Crunch teeth particle. +#define B_NEW_HANDS_FEET_PARTICLE FALSE // If set to TRUE, it updates chop/kick/punch particles. +#define B_NEW_SPIKES_PARTICLE FALSE // If set to TRUE, it updates Spikes particle. +#define B_NEW_FLY_BUBBLE_PARTICLE FALSE // If set to TRUE, it updates Fly's 'bubble' particle. +#define B_NEW_CURSE_NAIL_PARTICLE FALSE // If set to TRUE, it updates Curse's nail. +#define B_NEW_BATON_PASS_BALL_PARTICLE FALSE // If set to TRUE, it updates Baton Pass' Poké Ball sprite. +#define B_NEW_MORNING_SUN_STAR_PARTICLE FALSE // If set to TRUE, it updates Morning Sun's star particles. +#define B_NEW_IMPACT_PALETTE FALSE // If set to TRUE, it updates the basic 'hit' palette. +#define B_NEW_SURF_PARTICLE_PALETTE FALSE // If set to TRUE, it updates Surf's wave palette. // Poké Ball animation and sounds #define B_ENEMY_THROW_BALLS GEN_LATEST // In GEN_6+, enemy Trainers throw Poké Balls into battle instead of them just appearing on the ground and opening. From c625ac6d534fd08e7fc30b4c0bad060b7d213211 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 Aug 2024 09:43:18 -0400 Subject: [PATCH 091/225] Added multiple missing ability TODO tests (#5163) --- test/battle/ability/adaptability.c | 46 ++++++++ test/battle/ability/aerilate.c | 33 ++++++ test/battle/ability/aftermath.c | 4 + test/battle/ability/air_lock.c | 4 + test/battle/ability/analytic.c | 11 ++ test/battle/ability/anger_point.c | 4 +- test/battle/ability/anger_shell.c | 2 +- test/battle/ability/anticipation.c | 24 ++++ test/battle/ability/arena_trap.c | 11 ++ test/battle/ability/aroma_veil.c | 15 +++ test/battle/ability/as_one.c | 7 ++ test/battle/ability/aura_break.c | 6 + test/battle/ability/chilling_neigh.c | 4 + test/battle/ability/chlorophyll.c | 6 + test/battle/ability/cloud_nine.c | 31 ++++- test/battle/ability/damp.c | 2 +- test/battle/ability/drought.c | 5 + test/battle/ability/dry_skin.c | 4 + test/battle/ability/flower_gift.c | 4 + test/battle/ability/forecast.c | 9 +- .../ability/{ate_abilities.c => galvanize.c} | 70 +++-------- test/battle/ability/grim_neigh.c | 109 ++++++++++++++++++ test/battle/ability/harvest.c | 1 + test/battle/ability/hydration.c | 2 + test/battle/ability/ice_body.c | 2 + test/battle/ability/ice_face.c | 9 ++ test/battle/ability/leaf_guard.c | 6 + test/battle/ability/moxie.c | 76 ++++++++---- test/battle/ability/normalize.c | 16 +++ test/battle/ability/orichalcum_pulse.c | 5 + test/battle/ability/pixilate.c | 35 ++++++ test/battle/ability/protosynthesis.c | 4 + test/battle/ability/rain_dish.c | 2 + test/battle/ability/refrigerate.c | 34 ++++++ test/battle/ability/sand_force.c | 6 + test/battle/ability/sand_rush.c | 6 + test/battle/ability/sand_veil.c | 3 + test/battle/ability/slush_rush.c | 6 + test/battle/ability/snow_cloak.c | 3 + test/battle/ability/solar_power.c | 7 ++ test/battle/ability/swift_swim.c | 6 + test/battle/ability/unnerve.c | 6 + test/battle/gimmick/terastal.c | 40 ------- .../{ability => hold_effect}/booster_energy.c | 0 test/battle/hold_effect/utility_umbrella.c | 2 + test/battle/move_effect/weather_ball.c | 2 + 46 files changed, 566 insertions(+), 124 deletions(-) create mode 100644 test/battle/ability/adaptability.c create mode 100644 test/battle/ability/aerilate.c create mode 100644 test/battle/ability/aftermath.c create mode 100644 test/battle/ability/air_lock.c create mode 100644 test/battle/ability/analytic.c create mode 100644 test/battle/ability/anticipation.c create mode 100644 test/battle/ability/arena_trap.c create mode 100644 test/battle/ability/aroma_veil.c create mode 100644 test/battle/ability/as_one.c create mode 100644 test/battle/ability/aura_break.c create mode 100644 test/battle/ability/chilling_neigh.c create mode 100644 test/battle/ability/chlorophyll.c create mode 100644 test/battle/ability/drought.c rename test/battle/ability/{ate_abilities.c => galvanize.c} (50%) create mode 100644 test/battle/ability/grim_neigh.c create mode 100644 test/battle/ability/ice_face.c create mode 100644 test/battle/ability/normalize.c create mode 100644 test/battle/ability/orichalcum_pulse.c create mode 100644 test/battle/ability/pixilate.c create mode 100644 test/battle/ability/refrigerate.c create mode 100644 test/battle/ability/sand_force.c create mode 100644 test/battle/ability/sand_rush.c create mode 100644 test/battle/ability/slush_rush.c create mode 100644 test/battle/ability/solar_power.c create mode 100644 test/battle/ability/swift_swim.c create mode 100644 test/battle/ability/unnerve.c rename test/battle/{ability => hold_effect}/booster_energy.c (100%) diff --git a/test/battle/ability/adaptability.c b/test/battle/ability/adaptability.c new file mode 100644 index 0000000000..fecdc6b7e2 --- /dev/null +++ b/test/battle/ability/adaptability.c @@ -0,0 +1,46 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Adaptability increases same-type attack bonus from x1.5 to x2"); + +SINGLE_BATTLE_TEST("(TERA) Terastallizing into a different type with Adaptability gives 2.0x STAB", s16 damage) +{ + bool32 tera; + PARAMETRIZE { tera = GIMMICK_NONE; } + PARAMETRIZE { tera = GIMMICK_TERA; } + GIVEN { + PLAYER(SPECIES_CRAWDAUNT) { Ability(ABILITY_ADAPTABILITY); TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT, gimmick: tera); } + } SCENE { + MESSAGE("Crawdaunt used Headbutt!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + // The jump from no STAB to 2.0x STAB is a 2.0x boost. + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("(TERA) Terastallizing into the same type with Adaptability gives 2.25x STAB", s16 damage) +{ + bool32 tera; + PARAMETRIZE { tera = GIMMICK_NONE; } + PARAMETRIZE { tera = GIMMICK_TERA; } + GIVEN { + PLAYER(SPECIES_CRAWDAUNT) { Ability(ABILITY_ADAPTABILITY); TeraType(TYPE_WATER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WATER_PULSE, gimmick: tera); } + } SCENE { + MESSAGE("Crawdaunt used Water Pulse!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PULSE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + // The jump from 2x STAB to 2.25x STAB is a 1.125x boost. + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.125), results[1].damage); + } +} + +TO_DO_BATTLE_TEST("Adaptability does not affect Stellar-type moves"); diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c new file mode 100644 index 0000000000..8a5f889a66 --- /dev/null +++ b/test/battle/ability/aerilate.c @@ -0,0 +1,33 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); +} + +SINGLE_BATTLE_TEST("Aerilate turns a Normal-type move into Flying-type move") +{ + GIVEN { + PLAYER(SPECIES_MEGANIUM); + OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_MEGA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("It's super effective!"); + } +} + +TO_DO_BATTLE_TEST("Aerilate can not turn certain moves into Flying type moves"); +TO_DO_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+)"); +TO_DO_BATTLE_TEST("Aerilate boosts power of affected moves by 30% (Gen6)"); + +// Gen 6-7 +TO_DO_BATTLE_TEST("Aerilate overrides Electrify (Gen6-7)"); +TO_DO_BATTLE_TEST("Aerilate overrides Ion Deluge (Gen6-7)"); +// Gen 8+ +//TO_DO_BATTLE_TEST("Aerilate doesn't override Electrify (Gen8+)"); // No mon with Aerilate exists in Gen8+, but probably behaves similar to Pixilate, which does. +//TO_DO_BATTLE_TEST("Aerilate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV. diff --git a/test/battle/ability/aftermath.c b/test/battle/ability/aftermath.c new file mode 100644 index 0000000000..65c0be7dfd --- /dev/null +++ b/test/battle/ability/aftermath.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Aftermath damages the attacker by 1/4th of its max HP if they faint the target has this ability by a contact move"); diff --git a/test/battle/ability/air_lock.c b/test/battle/ability/air_lock.c new file mode 100644 index 0000000000..0201e86a20 --- /dev/null +++ b/test/battle/ability/air_lock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Air Lock are handled in test/battle/ability/cloud_nine.c diff --git a/test/battle/ability/analytic.c b/test/battle/ability/analytic.c new file mode 100644 index 0000000000..44c42ae2d5 --- /dev/null +++ b/test/battle/ability/analytic.c @@ -0,0 +1,11 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Analytic increases the power of moves by 30% if it's the last one that uses its move"); +TO_DO_BATTLE_TEST("Analytic takes into account modifications to speeed an priority (Gen 5-8)"); //Eg. Paralysis, Power Weight, Stall +TO_DO_BATTLE_TEST("Analytic does not take into account modifications to speeed an priority (Gen 8)"); //Eg. Paralysis, Power Weight, Stall +TO_DO_BATTLE_TEST("Analytic takes into account the turn order of what fainted Pokémon would've moved"); + +// Triple Battles needed to test +//TO_DO_BATTLE_TEST("If the Pokémon with Analytic is targeting a Pokémon in a flank position that chooses to switch with its ally in the middle, its move's power will always be normal when it attacks the Pokémon that is shifted into the flank position"); +//TO_DO_BATTLE_TEST("If the Pokémon with Analytic targets a Pokémon in the middle whose ally on a flank chooses to shift into the middle position, its move's power still depends on whether the Pokémon that was in the middle (and is now on a flank) has acted when the Pokémon with Analytic uses its move"); diff --git a/test/battle/ability/anger_point.c b/test/battle/ability/anger_point.c index 0b13b9df4b..7cb283426a 100644 --- a/test/battle/ability/anger_point.c +++ b/test/battle/ability/anger_point.c @@ -47,7 +47,9 @@ SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack } } -SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit") +TO_DO_BATTLE_TEST("Anger Point triggers when a substitute takes the hit (Gen4)"); + +SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit (Gen5+)") { ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); diff --git a/test/battle/ability/anger_shell.c b/test/battle/ability/anger_shell.c index f0d11d7576..c5b490216b 100644 --- a/test/battle/ability/anger_shell.c +++ b/test/battle/ability/anger_shell.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Anger Shell activates only if the target had more than 50% of its hp") +SINGLE_BATTLE_TEST("Anger Shell activates only if the target had more than 50% of its HP") { bool32 activates = FALSE; u16 maxHp = 500, hp = 0; diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c new file mode 100644 index 0000000000..a15ff153d9 --- /dev/null +++ b/test/battle/ability/anticipation.c @@ -0,0 +1,24 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effective move"); +TO_DO_BATTLE_TEST("Anticipation causes notifies if an opponent has a One-hit KO move"); +TO_DO_BATTLE_TEST("Anticipation causes notifies if an opponent has a Self-Destruct or Explosion (Gen4)"); +TO_DO_BATTLE_TEST("Anticipation treats Self-Destruct and Explosion like all other Normal types (Gen5+)"); + +TO_DO_BATTLE_TEST("Anticipation considers Scrappy and Normalize into their effectiveness (Gen4)"); +TO_DO_BATTLE_TEST("Anticipation doesn't consider Scrappy and Normalize into their effectiveness (Gen5+)"); +TO_DO_BATTLE_TEST("Anticipation considers Gravity into their effectiveness (Gen4)"); +TO_DO_BATTLE_TEST("Anticipation doesn't consider Gravity into their effectiveness (Gen5+)"); +TO_DO_BATTLE_TEST("Anticipation doesn't trigger from Counter, Metal Burst or Mirror Coat (Gen4)"); +TO_DO_BATTLE_TEST("Anticipation counts Counter, Metal Burst or Mirror Coat as attacking moves of their types (Gen5+)"); +TO_DO_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-type move"); +TO_DO_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type move"); +TO_DO_BATTLE_TEST("Anticipation considers Flying Press as an ordinary Fighting-type move"); +TO_DO_BATTLE_TEST("Anticipation considers Aura Wheel as an ordinary Electric-type move"); +TO_DO_BATTLE_TEST("Anticipation considers Inverse Battle types"); //Check with Normal-type moves +TO_DO_BATTLE_TEST("Anticipation treats dynamic move types as their base type (Normal)"); // Judgment, Weather Ball, Natural Gift, Techno Blast, Revelation Dance, Multi Attack +TO_DO_BATTLE_TEST("Anticipation treats Hidden Power as Normal Type (Gen4-5)"); +TO_DO_BATTLE_TEST("Anticipation treats Hidden Power as its dynamic type (Gen6+)"); +TO_DO_BATTLE_TEST("Anticipation does not consider Strong Winds on type matchups"); +TO_DO_BATTLE_TEST("Anticipation does not consider ate-abilities"); diff --git a/test/battle/ability/arena_trap.c b/test/battle/ability/arena_trap.c new file mode 100644 index 0000000000..ef0d5b7d8c --- /dev/null +++ b/test/battle/ability/arena_trap.c @@ -0,0 +1,11 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Arena Trap prevents grounded adjacent opponents from switching out"); +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs if the Pokémon is switched in the same turn the opponent decided to switch out"); +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via moves that switch out"); // Baton Pass, U-Turn, Volt Switch, Flip Turn, Parting Shot +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Shed Shell, but not via Teleport"); +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Run Away"); +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Smoke Ball"); +TO_DO_BATTLE_TEST("Arena Trap prevents switch outs from Ghost-type Pokémon (Gen3-5)"); +TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs from Ghost-type Pokémon (Gen6+)"); diff --git a/test/battle/ability/aroma_veil.c b/test/battle/ability/aroma_veil.c new file mode 100644 index 0000000000..dc53fa1492 --- /dev/null +++ b/test/battle/ability/aroma_veil.c @@ -0,0 +1,15 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Taunt"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Torment"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Encore"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Cursed Body"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Heal Block"); +TO_DO_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation"); +TO_DO_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Imprison"); + +// Marked in Bulbapedia as need of research +//TO_DO_BATTLE_TEST("Aroma Veil prevents G-Max Meltdown's effect"); +//TO_DO_BATTLE_TEST("Aroma Veil prevents Psychic Noise's effect"); diff --git a/test/battle/ability/as_one.c b/test/battle/ability/as_one.c new file mode 100644 index 0000000000..0d5367bf37 --- /dev/null +++ b/test/battle/ability/as_one.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for the individual ability effects are handled in the following times: +// - Unnerve: test/battle/ability/unnerve.c +// - Chilling Neigh: test/battle/ability/chilling_neigh.c +// - Grim Neigh: test/battle/ability/grim_neigh.c diff --git a/test/battle/ability/aura_break.c b/test/battle/ability/aura_break.c new file mode 100644 index 0000000000..93b21421e4 --- /dev/null +++ b/test/battle/ability/aura_break.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Aura Break inverts Fairy Aura's effect"); +TO_DO_BATTLE_TEST("Aura Break inverts Dark Aura's effect"); +TO_DO_BATTLE_TEST("Aura Break ignores Mold Breaker abilities"); diff --git a/test/battle/ability/chilling_neigh.c b/test/battle/ability/chilling_neigh.c new file mode 100644 index 0000000000..03be77000b --- /dev/null +++ b/test/battle/ability/chilling_neigh.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Chilling Neigh are handled in test/battle/ability/moxie.c diff --git a/test/battle/ability/chlorophyll.c b/test/battle/ability/chlorophyll.c new file mode 100644 index 0000000000..493a197638 --- /dev/null +++ b/test/battle/ability/chlorophyll.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Chlorophyll doubles speed if it's sunny"); +TO_DO_BATTLE_TEST("Chlorophyll doesn't double speed if Cloud Nine/Air Lock is on the field"); +TO_DO_BATTLE_TEST("Chlorophyll doesn't double speed if they have an Utility Umbrella"); diff --git a/test/battle/ability/cloud_nine.c b/test/battle/ability/cloud_nine.c index dfe5611fc4..887769a5ec 100644 --- a/test/battle/ability/cloud_nine.c +++ b/test/battle/ability/cloud_nine.c @@ -1,16 +1,41 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Cloud Nine prevents weather effects") +SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Sandstorm") { + u32 species = 0, ability = 0; + PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { ASSUME(gMovesInfo[MOVE_SANDSTORM].effect == EFFECT_SANDSTORM); - PLAYER(SPECIES_PSYDUCK) { Ability(ABILITY_CLOUD_NINE); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SANDSTORM); } TURN {} } SCENE { - NONE_OF { HP_BAR(player); } + ABILITY_POPUP(player, ability); + MESSAGE("The effects of weather disappeared."); + MESSAGE("Foe Wobbuffet used Sandstorm!"); + MESSAGE("The sandstorm rages."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES); + NONE_OF { + HP_BAR(player); + HP_BAR(opponent); + MESSAGE("Foe Wobbuffet is buffeted by the sandstorm!"); + } + MESSAGE("The sandstorm rages."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES); } } + +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Sun"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Rain"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Hail"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Snow"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Fog"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Primal Sun"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Primal Rain"); +TO_DO_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Strong Winds"); + +// Moves and abilities that are affected by weather should have new tests that check for Clould Nine/Air Lock, like Mold-Breaker Abilities diff --git a/test/battle/ability/damp.c b/test/battle/ability/damp.c index 9a3b795f2a..b567293aa0 100644 --- a/test/battle/ability/damp.c +++ b/test/battle/ability/damp.c @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self") } } -SINGLE_BATTLE_TEST("Damp prevents damage from aftermath") +SINGLE_BATTLE_TEST("Damp prevents damage from Aftermath") { GIVEN { ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); diff --git a/test/battle/ability/drought.c b/test/battle/ability/drought.c new file mode 100644 index 0000000000..bbe4dbe853 --- /dev/null +++ b/test/battle/ability/drought.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)"); +TO_DO_BATTLE_TEST("Drought sets up permanent sun (Gen3-5)"); diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 368e4b8047..5709a58a94 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -15,6 +15,8 @@ SINGLE_BATTLE_TEST("Dry Skin causes 1/8th Max HP damage in Sun") } } +TO_DO_BATTLE_TEST("Dry Skin doesn't get damaged in Sun if Cloud Nine/Air Lock is on the field"); + SINGLE_BATTLE_TEST("Dry Skin heals 1/8th Max HP in Rain") { GIVEN { @@ -29,6 +31,8 @@ SINGLE_BATTLE_TEST("Dry Skin heals 1/8th Max HP in Rain") } } +TO_DO_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on the field"); + SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%", s16 damage) { u32 ability; diff --git a/test/battle/ability/flower_gift.c b/test/battle/ability/flower_gift.c index 69a76b8e81..68712641e0 100644 --- a/test/battle/ability/flower_gift.c +++ b/test/battle/ability/flower_gift.c @@ -17,6 +17,8 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim in harsh sunlight") } } +TO_DO_BATTLE_TEST("Flower Gift doesn't transform Cherrim if Cloud Nine/Air Lock is on the field"); + SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when weather changes") { GIVEN { @@ -61,6 +63,8 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its abili } } +TO_DO_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock"); + DOUBLE_BATTLE_TEST("Flower Gift increases the attack of Cherrim and its allies by 1.5x", s16 damageL, s16 damageR) { bool32 sunny; diff --git a/test/battle/ability/forecast.c b/test/battle/ability/forecast.c index 427a8e6807..296c123dbd 100644 --- a/test/battle/ability/forecast.c +++ b/test/battle/ability/forecast.c @@ -264,12 +264,15 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when Sandstorm i } } -SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Air Lock") +SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock") { + u32 species = 0, ability = 0; + PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { PLAYER(SPECIES_CASTFORM_NORMAL) { Ability(ABILITY_FORECAST); } OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_RAYQUAZA); + OPPONENT(species) { Ability(ability); } } WHEN { TURN { MOVE(player, MOVE_RAIN_DANCE); } TURN { SWITCH(opponent, 1); } @@ -279,7 +282,7 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Air Lock") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Castform transformed!"); // back to normal - ABILITY_POPUP(opponent, ABILITY_AIR_LOCK); + ABILITY_POPUP(opponent, ability); ABILITY_POPUP(player, ABILITY_FORECAST); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Castform transformed!"); diff --git a/test/battle/ability/ate_abilities.c b/test/battle/ability/galvanize.c similarity index 50% rename from test/battle/ability/ate_abilities.c rename to test/battle/ability/galvanize.c index 203452cc01..55dfd7287a 100644 --- a/test/battle/ability/ate_abilities.c +++ b/test/battle/ability/galvanize.c @@ -7,6 +7,19 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); } +SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric") +{ + GIVEN { + PLAYER(SPECIES_KRABBY); + OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("It's super effective!"); + } +} + SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type moves") { u32 move; @@ -29,56 +42,7 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move } } -SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric") -{ - GIVEN { - PLAYER(SPECIES_KRABBY); - OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); - MESSAGE("It's super effective!"); - } -} - -SINGLE_BATTLE_TEST("Pixilate turns a normal type move into Fairy") -{ - GIVEN { - PLAYER(SPECIES_DRAGONITE); - OPPONENT(SPECIES_ALTARIA) { Item(ITEM_ALTARIANITE); } - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_MEGA); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); - MESSAGE("It's super effective!"); - } -} - -SINGLE_BATTLE_TEST("Refrigerate turns a normal type move into Ice") -{ - GIVEN { - PLAYER(SPECIES_MEGANIUM); - OPPONENT(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); } - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); - MESSAGE("It's super effective!"); - } -} - -SINGLE_BATTLE_TEST("Aerilate turns a normal type move into Flying") -{ - GIVEN { - PLAYER(SPECIES_MEGANIUM); - OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_MEGA); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); - MESSAGE("It's super effective!"); - } -} +TO_DO_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+)"); +TO_DO_BATTLE_TEST("Galvanize boosts power of affected moves by 30% (Gen6)"); +TO_DO_BATTLE_TEST("(DYNAMAX) Galvanize turns Max Strike into Max Lightning when not used by Gigantamax Pikachu/Toxtricity"); +//TO_DO_BATTLE_TEST("(DYNAMAX) Galvanize doesn't turn Max Strike into Max Lightning when used by Gigantamax Pikachu/Toxtricity, instead becoming G-Max Volt Crash/Stun Shock"); // Marked in Bulbapedia as "needs research", so this assumes that it behaves like Pixilate. diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c new file mode 100644 index 0000000000..b4d82487d8 --- /dev/null +++ b/test/battle/ability/grim_neigh.c @@ -0,0 +1,109 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly causing a Pokemon to faint") +{ + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + GIVEN { + ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(species) { Ability(ability); } + PLAYER(SPECIES_SNORUNT) { HP(1); } + OPPONENT(SPECIES_GLALIE) { HP(1); } + OPPONENT(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_DISCHARGE); SEND_OUT(opponentLeft, 2); } + } SCENE { + int i; + + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + for (i = 0; i < 3; i++) { + ONE_OF { + MESSAGE("Snorunt fainted!"); + MESSAGE("Foe Glalie fainted!"); + MESSAGE("Foe Abra fainted!"); + } + ABILITY_POPUP(playerLeft, abilityPopUp); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + if (species == SPECIES_SPECTRIER) + MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); + else + MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); + } + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 3); + } +} + +DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") +{ + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + GIVEN { + PLAYER(species) { Ability(ability); } + PLAYER(SPECIES_SNORUNT) { HP(1); Status1(STATUS1_POISON); } + OPPONENT(SPECIES_GLALIE) { HP(1); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentRight); SEND_OUT(opponentLeft, 2); } + } SCENE { + int i; + + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, playerRight); + for (i = 0; i < 3; i++) { + ONE_OF { + MESSAGE("Snorunt fainted!"); + MESSAGE("Foe Glalie fainted!"); + MESSAGE("Foe Abra fainted!"); + } + NONE_OF { + ABILITY_POPUP(playerLeft, abilityPopUp); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Salamence's Moxie raised its Sp. Atk!"); + MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); + MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); + } + } + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move that causes another Pokemon to faint") +{ + s16 damage[2]; + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } + + KNOWN_FAILING; // Requires simultaneous damage implementation + GIVEN { + ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(species) { Ability(ability); } + PLAYER(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_GLALIE); + OPPONENT(SPECIES_GLALIE); + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_DISCHARGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(playerRight); + MESSAGE("Abra fainted!"); + ABILITY_POPUP(playerLeft, abilityPopUp); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + if (species == SPECIES_SPECTRIER) + MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); + else + MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); + HP_BAR(opponentRight, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index 9fb969b036..b4783c4542 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -3,6 +3,7 @@ TO_DO_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn"); TO_DO_BATTLE_TEST("Harvest always restores a Berry in Sunlight"); +TO_DO_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Lock is on the field"); TO_DO_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in"); TO_DO_BATTLE_TEST("Harvest restores a Berry consumed by Fling"); TO_DO_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift"); diff --git a/test/battle/ability/hydration.c b/test/battle/ability/hydration.c index 2dca490c02..7d16ad04ae 100644 --- a/test/battle/ability/hydration.c +++ b/test/battle/ability/hydration.c @@ -14,3 +14,5 @@ SINGLE_BATTLE_TEST("Hydration cures non-volatile Status conditions if it is rain STATUS_ICON(player, none: TRUE); } } + +TO_DO_BATTLE_TEST("Hydration doesn't cure status conditions if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/ice_body.c b/test/battle/ability/ice_body.c index 1aa7c80a4d..304059a00e 100644 --- a/test/battle/ability/ice_body.c +++ b/test/battle/ability/ice_body.c @@ -26,3 +26,5 @@ SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.") MESSAGE("Glalie's Ice Body healed it a little bit!"); } } + +TO_DO_BATTLE_TEST("Sand Rush doesn't recover HP if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/ice_face.c b/test/battle/ability/ice_face.c new file mode 100644 index 0000000000..53917b5623 --- /dev/null +++ b/test/battle/ability/ice_face.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noice Face form"); // Include Special move in test +TO_DO_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face Eiscue is out"); +TO_DO_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while hail or snow is active"); +TO_DO_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face form while there's already hail"); +TO_DO_BATTLE_TEST("Ice Face form change persists after switching out"); +TO_DO_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index 6c559ea48a..2c55236def 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -27,6 +27,8 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") } } +TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent non-volatile status conditions if Cloud Nine/Air Lock is on the field"); + SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Toxic Orb") { u32 item; @@ -49,6 +51,8 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Tox } } +TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent status conditions from Flame Orb and Toxic Orb if Cloud Nine/Air Lock is on the field"); + SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun") { GIVEN { @@ -66,3 +70,5 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun") } } } + +TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index b60a11507a..79b1fc989f 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -1,12 +1,15 @@ #include "global.h" #include "test/battle.h" -DOUBLE_BATTLE_TEST("Moxie raises Attack by one stage after directly causing a Pokemon to faint") +DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after directly causing a Pokemon to faint") { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); - + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - PLAYER(SPECIES_SALAMENCE) { Ability(ABILITY_MOXIE); } + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_GLALIE) { HP(1); } OPPONENT(SPECIES_ABRA) { HP(1); } @@ -23,19 +26,28 @@ DOUBLE_BATTLE_TEST("Moxie raises Attack by one stage after directly causing a Po MESSAGE("Foe Glalie fainted!"); MESSAGE("Foe Abra fainted!"); } - ABILITY_POPUP(playerLeft, ABILITY_MOXIE); + ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); - MESSAGE("Salamence's Moxie raised its Attack!"); + if (species == SPECIES_SALAMENCE) + MESSAGE("Salamence's Moxie raised its Attack!"); + else if (species == SPECIES_GLASTRIER) + MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); + else + MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); } } THEN { EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 3); } } -DOUBLE_BATTLE_TEST("Moxie does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") +DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") { + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - PLAYER(SPECIES_SALAMENCE) { Ability(ABILITY_MOXIE); } + PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); Status1(STATUS1_POISON); } OPPONENT(SPECIES_GLALIE) { HP(1); Status1(STATUS1_BURN); } OPPONENT(SPECIES_ABRA) { HP(1); } @@ -53,9 +65,11 @@ DOUBLE_BATTLE_TEST("Moxie does not trigger if Pokemon faint to indirect damage o MESSAGE("Foe Abra fainted!"); } NONE_OF { - ABILITY_POPUP(playerLeft, ABILITY_MOXIE); + ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Salamence's Moxie raised its Attack!"); + MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); + MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); } } } THEN { @@ -63,12 +77,15 @@ DOUBLE_BATTLE_TEST("Moxie does not trigger if Pokemon faint to indirect damage o } } -SINGLE_BATTLE_TEST("Moxie does not trigger when already at maximum Attack stage") +SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximum Attack stage") { - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); - + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - PLAYER(SPECIES_SALAMENCE) { Ability(ABILITY_MOXIE); } + ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_SNORUNT); } WHEN { @@ -77,28 +94,38 @@ SINGLE_BATTLE_TEST("Moxie does not trigger when already at maximum Attack stage" } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Salamence cut its own HP and maximized ATTACK!"); + if (species == SPECIES_SALAMENCE) + MESSAGE("Salamence cut its own HP and maximized ATTACK!"); + else if (species == SPECIES_GLASTRIER) + MESSAGE("Glastrier cut its own HP and maximized ATTACK!"); + else + MESSAGE("Calyrex cut its own HP and maximized ATTACK!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, player); MESSAGE("Foe Snorunt fainted!"); - NONE_OF { - ABILITY_POPUP(player, ABILITY_MOXIE); + NONE_OF { + ABILITY_POPUP(player, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Salamence's Moxie raised its Attack!"); + MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); + MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); } } THEN { EXPECT_EQ(player->statStages[STAT_ATK], MAX_STAT_STAGE); } } -DOUBLE_BATTLE_TEST("Moxie does not increase damage done by the same move that causes another Pokemon to faint") +DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the same move that causes another Pokemon to faint") { s16 damage[2]; - - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + u32 species = 0, ability = 0, abilityPopUp = 0; + PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } + PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } KNOWN_FAILING; // Requires simultaneous damage implementation GIVEN { - PLAYER(SPECIES_SALAMENCE) { Ability(ABILITY_MOXIE); } + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(species) { Ability(ability); } PLAYER(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_GLALIE); OPPONENT(SPECIES_GLALIE); @@ -110,9 +137,14 @@ DOUBLE_BATTLE_TEST("Moxie does not increase damage done by the same move that ca HP_BAR(opponentLeft, captureDamage: &damage[0]); HP_BAR(playerRight); MESSAGE("Abra fainted!"); - ABILITY_POPUP(playerLeft, ABILITY_MOXIE); + ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); - MESSAGE("Salamence's Moxie raised its Attack!"); + if (species == SPECIES_SALAMENCE) + MESSAGE("Salamence's Moxie raised its Attack!"); + else if (species == SPECIES_GLASTRIER) + MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); + else + MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); HP_BAR(opponentRight, captureDamage: &damage[1]); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c new file mode 100644 index 0000000000..d3e8df6bee --- /dev/null +++ b/test/battle/ability/normalize.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Normalize tuns a move into a Normal-type move"); +TO_DO_BATTLE_TEST("Normalize boosts power of both affected and originally Normal-type moves by 20% (Gen7+)"); +TO_DO_BATTLE_TEST("Normalize affects status moves"); // Eg. Thunder Wave can affect Ground types +TO_DO_BATTLE_TEST("Normalize makes Flying Press do Normal/Flying damage"); +TO_DO_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type Pokémon"); +TO_DO_BATTLE_TEST("Normalize-affected moves become Electric-type under Electrify's effect"); +TO_DO_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Deluge's effect"); +TO_DO_BATTLE_TEST("Normalize doesn't affect Hidden Power's type"); +TO_DO_BATTLE_TEST("Normalize doesn't affect Weather Ball's type"); +TO_DO_BATTLE_TEST("Normalize doesn't affect Natural Gift's type"); +TO_DO_BATTLE_TEST("Normalize doesn't affect Judgment/Techno Blast/Multi-Attack's type"); +TO_DO_BATTLE_TEST("Normalize doesn't affect Terrain Pulse's type"); +TO_DO_BATTLE_TEST("Normalize doesn't affect damaging Z-Move types"); diff --git a/test/battle/ability/orichalcum_pulse.c b/test/battle/ability/orichalcum_pulse.c new file mode 100644 index 0000000000..295e0db23c --- /dev/null +++ b/test/battle/ability/orichalcum_pulse.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Orichalcum Pulse sets up sun for 5 turns"); +TO_DO_BATTLE_TEST("Orichalcum Pulse boosts the Pokémon's Attack by 33% in sun, even if it's holding an Utility Umbrella"); diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c new file mode 100644 index 0000000000..97c9c37a0c --- /dev/null +++ b/test/battle/ability/pixilate.c @@ -0,0 +1,35 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); +} + +SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move") +{ + GIVEN { + PLAYER(SPECIES_DRAGONITE); + OPPONENT(SPECIES_ALTARIA) { Item(ITEM_ALTARIANITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_MEGA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("It's super effective!"); + } +} + +TO_DO_BATTLE_TEST("Pixilate can not turn certain moves into Fairy type moves"); +TO_DO_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+)"); +TO_DO_BATTLE_TEST("Pixilate boosts power of affected moves by 30% (Gen6)"); +TO_DO_BATTLE_TEST("(DYNAMAX) Pixilate turns Max Strike into Max Starfall when not used by Gigantamax Alcremie"); +TO_DO_BATTLE_TEST("(DYNAMAX) Pixilate doesn't turn Max Strike into Max Starfall when used by Gigantamax Alcremie, instead becoming G-Max Finale"); + +// Gen 6-7 +TO_DO_BATTLE_TEST("Pixilate overrides Electrify (Gen6-7)"); +TO_DO_BATTLE_TEST("Pixilate overrides Ion Deluge (Gen6-7)"); +// Gen 8+ +TO_DO_BATTLE_TEST("Pixilate doesn't override Electrify (Gen8+)"); +//TO_DO_BATTLE_TEST("Pixilate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV. diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 3cb35164ec..58f10b366f 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -99,3 +99,7 @@ SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in") MESSAGE("Roaring Moon's Attack was heightened!"); } } + +TO_DO_BATTLE_TEST("Protosynthesis activates in sun before Booster Energy"); +TO_DO_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella"); +TO_DO_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/rain_dish.c b/test/battle/ability/rain_dish.c index dd647f0eb9..ed71a67f92 100644 --- a/test/battle/ability/rain_dish.c +++ b/test/battle/ability/rain_dish.c @@ -14,3 +14,5 @@ SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain") HP_BAR(player, damage: -(100 / 16)); } } + +TO_DO_BATTLE_TEST("Rain Dish doesn't recover HP if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c new file mode 100644 index 0000000000..dbbaa30eb8 --- /dev/null +++ b/test/battle/ability/refrigerate.c @@ -0,0 +1,34 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); +} + +SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move") +{ + GIVEN { + PLAYER(SPECIES_MEGANIUM); + OPPONENT(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("It's super effective!"); + } +} + +TO_DO_BATTLE_TEST("Refrigerate can not turn certain moves into Ice type moves"); +TO_DO_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+)"); +TO_DO_BATTLE_TEST("Refrigerate boosts power of affected moves by 30% (Gen6)"); +TO_DO_BATTLE_TEST("(DYNAMAX) Refrigerate turns Max Strike into Max Hailstorm when not used by Gigantamax Lapras"); +//TO_DO_BATTLE_TEST("(DYNAMAX) Refrigerate doesn't turn Max Strike into Max Hailstorm when used by Gigantamax Lapras, instead becoming G-Max Resonance"); // Marked in Bulbapedia as "needs research", so this assumes that it behaves like Pixilate. + +// Gen 6-7 +TO_DO_BATTLE_TEST("Refrigerate overrides Electrify (Gen6-7)"); +TO_DO_BATTLE_TEST("Refrigerate overrides Ion Deluge (Gen6-7)"); +// Gen 8+ +//TO_DO_BATTLE_TEST("Refrigerate doesn't override Electrify (Gen8+)"); // Bulbapedia doesn't list this effect, so it assumes it behaves like Pixilate. +//TO_DO_BATTLE_TEST("Refrigerate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV. diff --git a/test/battle/ability/sand_force.c b/test/battle/ability/sand_force.c new file mode 100644 index 0000000000..e17722a885 --- /dev/null +++ b/test/battle/ability/sand_force.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Sand Force prevents damage from sandstorm"); +TO_DO_BATTLE_TEST("Sand Force increases the power of Rock-, Ground- and Steel-type moves by 30% in sandstorm"); +TO_DO_BATTLE_TEST("Sand Force increases move power if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/sand_rush.c b/test/battle/ability/sand_rush.c new file mode 100644 index 0000000000..fa7695c129 --- /dev/null +++ b/test/battle/ability/sand_rush.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Sand Rush prevents damage from sandstorm"); +TO_DO_BATTLE_TEST("Sand Rush doubles speed from sandstorm"); +TO_DO_BATTLE_TEST("Sand Rush doesn't double speed if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/sand_veil.c b/test/battle/ability/sand_veil.c index 9e4a634de2..f42c267273 100644 --- a/test/battle/ability/sand_veil.c +++ b/test/battle/ability/sand_veil.c @@ -28,3 +28,6 @@ SINGLE_BATTLE_TEST("Sand Veil increases evasion during sandstorm") HP_BAR(player); } } + +TO_DO_BATTLE_TEST("Sand Veil doesn't prevent Sandstorm damage if Cloud Nine/Air Lock is on the field"); +TO_DO_BATTLE_TEST("Sand Veil doesn't increase evasion if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/slush_rush.c b/test/battle/ability/slush_rush.c new file mode 100644 index 0000000000..8ae62454bb --- /dev/null +++ b/test/battle/ability/slush_rush.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Slush Rush doubles speed from hail"); +TO_DO_BATTLE_TEST("Slush Rush doubles speed from snow"); +TO_DO_BATTLE_TEST("Slush Rush doesn't double speed if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/snow_cloak.c b/test/battle/ability/snow_cloak.c index f1bfbcb9b0..a4d1acadb7 100644 --- a/test/battle/ability/snow_cloak.c +++ b/test/battle/ability/snow_cloak.c @@ -27,3 +27,6 @@ SINGLE_BATTLE_TEST("Snow Cloak increases evasion during hail") HP_BAR(player); } } + +TO_DO_BATTLE_TEST("Snow Cloak doesn't prevent hail damage if Cloud Nine/Air Lock is on the field"); +TO_DO_BATTLE_TEST("Snow Cloak doesn't increase evasion if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/solar_power.c b/test/battle/ability/solar_power.c new file mode 100644 index 0000000000..f14ea11ee1 --- /dev/null +++ b/test/battle/ability/solar_power.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Solar Power increases a Sp. Attack by x1.5 in Sun"); +TO_DO_BATTLE_TEST("Solar Power doesn't increases a Sp. Attack if Cloud Nine/Air Lock is on the field"); +TO_DO_BATTLE_TEST("Solar Power causes the Pokémon to lose 1/8 max HP in Sun"); +TO_DO_BATTLE_TEST("Solar Power doesn't cause the Pokémon to lose 1/8 max HP if Cloud Nine/Air Lock is on the field"); diff --git a/test/battle/ability/swift_swim.c b/test/battle/ability/swift_swim.c new file mode 100644 index 0000000000..4282ac2741 --- /dev/null +++ b/test/battle/ability/swift_swim.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Swift Swim doubles speed if it's raining"); +TO_DO_BATTLE_TEST("Swift Swim doesn't double speed if Cloud Nine/Air Lock is on the field"); +TO_DO_BATTLE_TEST("Swift Swim doesn't double speed if they have an Utility Umbrella"); diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c new file mode 100644 index 0000000000..9ad4ee7e5f --- /dev/null +++ b/test/battle/ability/unnerve.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +// Remember to add a PARAMETRIZE for As One in the following tests: +TO_DO_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own berries"); +TO_DO_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural Gift"); diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index f14c398b64..7a70ba0de0 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -86,46 +86,6 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the same type gives that type 2x } } -SINGLE_BATTLE_TEST("(TERA) Terastallizing into a different type with Adaptability gives 2.0x STAB", s16 damage) -{ - bool32 tera; - PARAMETRIZE { tera = GIMMICK_NONE; } - PARAMETRIZE { tera = GIMMICK_TERA; } - GIVEN { - PLAYER(SPECIES_CRAWDAUNT) { Ability(ABILITY_ADAPTABILITY); TeraType(TYPE_NORMAL); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_HEADBUTT, gimmick: tera); } - } SCENE { - MESSAGE("Crawdaunt used Headbutt!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - // The jump from no STAB to 2.0x STAB is a 2.0x boost. - EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); - } -} - -SINGLE_BATTLE_TEST("(TERA) Terastallizing into the same type with Adaptability gives 2.25x STAB", s16 damage) -{ - bool32 tera; - PARAMETRIZE { tera = GIMMICK_NONE; } - PARAMETRIZE { tera = GIMMICK_TERA; } - GIVEN { - PLAYER(SPECIES_CRAWDAUNT) { Ability(ABILITY_ADAPTABILITY); TeraType(TYPE_WATER); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_WATER_PULSE, gimmick: tera); } - } SCENE { - MESSAGE("Crawdaunt used Water Pulse!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PULSE, player); - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - // The jump from 2x STAB to 2.25x STAB is a 1.125x boost. - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.125), results[1].damage); - } -} - SINGLE_BATTLE_TEST("(TERA) Terastallizing boosts moves of the same type to 60 BP", s16 damage) { bool32 tera; diff --git a/test/battle/ability/booster_energy.c b/test/battle/hold_effect/booster_energy.c similarity index 100% rename from test/battle/ability/booster_energy.c rename to test/battle/hold_effect/booster_energy.c diff --git a/test/battle/hold_effect/utility_umbrella.c b/test/battle/hold_effect/utility_umbrella.c index e02a4fdef3..f04a773789 100644 --- a/test/battle/hold_effect/utility_umbrella.c +++ b/test/battle/hold_effect/utility_umbrella.c @@ -52,3 +52,5 @@ SINGLE_BATTLE_TEST("Utility Umbrella blocks Rain damage modifiers", s16 damage) EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); } } + +// Moves and abilities affected by Utility Umbrella have their tests in the respective files diff --git a/test/battle/move_effect/weather_ball.c b/test/battle/move_effect/weather_ball.c index 1656b60d87..432e5f79f7 100644 --- a/test/battle/move_effect/weather_ball.c +++ b/test/battle/move_effect/weather_ball.c @@ -78,3 +78,5 @@ SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to an Ice-type move EXPECT_MUL_EQ(results[0].damage, Q_4_12(4.0), results[1].damage); // double base power + type effectiveness. } } + +TO_DO_BATTLE_TEST("Weather Ball doesn't double its power or change type if Cloud Nine/Air Lock is on the field"); From 6f0004ec4ed7b052052f5bfb785ab4b63e3ce954 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 Aug 2024 09:51:34 -0400 Subject: [PATCH 092/225] Removed some hardcoding of move IDs + Gen4/5 Defog (#5156) * Removed some hardcoding of move IDs * Added Defog Gen6+ config (+ updated tests) --- include/config/battle.h | 2 +- src/battle_ai_main.c | 2 +- src/battle_ai_switch_items.c | 4 +- src/battle_script_commands.c | 21 +++++---- src/battle_util.c | 2 +- src/pokemon.c | 21 ++++----- test/battle/move_effect/defog.c | 77 ++++++++++++++++++++------------- 7 files changed, 75 insertions(+), 54 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 72fda7f76c..4bf84a1716 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -110,7 +110,7 @@ #define B_BURN_HIT_THAW GEN_LATEST // In Gen6+, damaging moves with a chance of burn will thaw the target, regardless if they're fire-type moves or not. #define B_HEALING_WISH_SWITCH GEN_LATEST // In Gen5+, the mon receiving Healing Wish is sent out at the end of the turn. // Additionally, in gen8+ the Healing Wish's effect will be stored until the user switches into a statused or hurt mon. -#define B_DEFOG_CLEARS_TERRAIN GEN_LATEST // In Gen8+, Defog also clears active Terrain. +#define B_DEFOG_EFFECT_CLEARING GEN_LATEST // In Gen6+, Defog clears Spikes, Toxic Spikes, Stealth Rock and Sticky Web from both sides. In Gen8+, Defog also clears active Terrain. #define B_STOCKPILE_RAISES_DEFS GEN_LATEST // In Gen4+, Stockpile also raises Defense and Sp. Defense stats. Once Spit Up / Swallow is used, these stat changes are lost. #define B_TRANSFORM_SHINY GEN_LATEST // In Gen4+, Transform will copy the shiny state of the opponent instead of maintaining its own shiny state. #define B_TRANSFORM_FORM_CHANGES GEN_LATEST // In Gen5+, Transformed Pokemon cannot change forms. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c814210766..b0229cd926 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4056,7 +4056,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn break; default: - if (move != MOVE_BESTOW && aiData->items[battlerAtk] == ITEM_NONE) + if (gMovesInfo[gCurrentMove].effect != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE) { switch (aiData->holdEffects[battlerDef]) { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 966082f32f..e1e25b5279 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -881,7 +881,9 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) for (j = 0; j < MAX_MON_MOVES; j++) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL); - if (aiMove == MOVE_RAPID_SPIN || aiMove == MOVE_DEFOG || aiMove == MOVE_MORTAL_SPIN || aiMove == MOVE_TIDY_UP) + if (MoveHasAdditionalEffectSelf(aiMove, MOVE_EFFECT_RAPID_SPIN) + || (B_DEFOG_EFFECT_CLEARING >= GEN_6 && gMovesInfo[aiMove].effect == EFFECT_DEFOG) + || gMovesInfo[aiMove].effect == EFFECT_TIDY_UP) { // Have a mon that can clear the hazards, so switching out is okay return TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ecd6fc7ffb..befc8f95ca 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1491,14 +1491,14 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); return TRUE; } // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) { if (!JumpIfMoveFailed(7, move)) RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); @@ -2165,7 +2165,7 @@ static void Cmd_attackanimation(void) && gCurrentMove != MOVE_SUBSTITUTE && gCurrentMove != MOVE_ALLY_SWITCH // 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)))) + && !(gMovesInfo[gCurrentMove].effect == EFFECT_TELEPORT && WILD_DOUBLE_BATTLE && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) { BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_Pausex20; @@ -8605,11 +8605,14 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) 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_SpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeDefog, 0); + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + { + DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesDefog, 0); + DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); + DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); + DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); + DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeDefog, 0); + } if (gBattleWeather & B_WEATHER_FOG) { gBattleWeather &= ~B_WEATHER_FOG; @@ -8617,7 +8620,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) gBattlescriptCurrInstr = BattleScript_FogEnded_Ret; return TRUE; } - if (B_DEFOG_CLEARS_TERRAIN >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { RemoveAllTerrains(); BattleScriptPushCursor(); diff --git a/src/battle_util.c b/src/battle_util.c index 9da592b09f..7bcdf1ee08 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8391,7 +8391,7 @@ u8 IsMonDisobedient(void) // is not obedient if (gCurrentMove == MOVE_RAGE) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK)) + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gMovesInfo[gCurrentMove].effect == EFFECT_SNORE || gMovesInfo[gCurrentMove].effect == EFFECT_SLEEP_TALK)) { gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; return 1; diff --git a/src/pokemon.c b/src/pokemon.c index cfb2307126..306e310372 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6957,8 +6957,9 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) u32 ability = GetMonAbility(mon); u32 type1 = gSpeciesInfo[species].types[0]; u32 type2 = gSpeciesInfo[species].types[1]; + u32 effect = gMovesInfo[move].effect; - if (move == MOVE_IVY_CUDGEL + if (effect == EFFECT_IVY_CUDGEL && (species == SPECIES_OGERPON_WELLSPRING_MASK || species == SPECIES_OGERPON_WELLSPRING_MASK_TERA || species == SPECIES_OGERPON_HEARTHFLAME_MASK || species == SPECIES_OGERPON_HEARTHFLAME_MASK_TERA || species == SPECIES_OGERPON_CORNERSTONE_MASK || species == SPECIES_OGERPON_CORNERSTONE_MASK_TERA)) @@ -6969,11 +6970,11 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) { return TYPE_NORMAL; } - else if (move == MOVE_TERA_BLAST && GetActiveGimmick(battler) == GIMMICK_TERA && gBattleMons[battler].species == species) + else if (effect == EFFECT_TERA_BLAST && GetActiveGimmick(battler) == GIMMICK_TERA && gBattleMons[battler].species == species) { return GetMonData(mon, MON_DATA_TERA_TYPE); } - else if (move == MOVE_TERA_STARSTORM && species == SPECIES_TERAPAGOS_STELLAR) + else if (effect == EFFECT_TERA_STARSTORM && species == SPECIES_TERAPAGOS_STELLAR) { return TYPE_STELLAR; } @@ -6981,32 +6982,32 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) { return CalculateHiddenPowerType(mon); } - else if (move == MOVE_AURA_WHEEL && species == SPECIES_MORPEKO_HANGRY) + else if (effect == EFFECT_AURA_WHEEL && species == SPECIES_MORPEKO_HANGRY) { type = TYPE_DARK; } - else if (gMovesInfo[move].effect == EFFECT_CHANGE_TYPE_ON_ITEM) + else if (effect == EFFECT_CHANGE_TYPE_ON_ITEM) { if (heldItemEffect == gMovesInfo[move].argument) return ItemId_GetSecondaryId(heldItem); else return TYPE_NORMAL; } - else if (move == MOVE_NATURAL_GIFT) + else if (effect == EFFECT_NATURAL_GIFT) { if (ItemId_GetPocket(heldItem) == POCKET_BERRIES) return gNaturalGiftTable[ITEM_TO_BERRY(heldItem)].type; else return TYPE_NORMAL; } - else if (move == MOVE_RAGING_BULL + else if (effect == EFFECT_RAGING_BULL && (species == SPECIES_TAUROS_PALDEAN_COMBAT_BREED || species == SPECIES_TAUROS_PALDEAN_BLAZE_BREED || species == SPECIES_TAUROS_PALDEAN_AQUA_BREED)) { return type2; } - else if (move == MOVE_REVELATION_DANCE) + else if (effect == EFFECT_REVELATION_DANCE) { if (gBattleMons[battler].species != species && type1 != TYPE_MYSTERY) type = type1; @@ -7021,7 +7022,7 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) else if (gBattleMons[battler].types[2] != TYPE_MYSTERY) type = gBattleMons[battler].types[2]; } - else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE + else if (effect == EFFECT_TERRAIN_PULSE && ((IsMonGrounded(heldItemEffect, ability, type1, type2) && gBattleMons[battler].species != species) || (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY) && gBattleMons[battler].species == species))) { @@ -7037,7 +7038,7 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) type = TYPE_NORMAL; } - if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL) + if (effect == EFFECT_WEATHER_BALL) { if (gMain.inBattle && WEATHER_HAS_EFFECT) { diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index 418d28d97b..80d500d2ee 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -131,7 +131,7 @@ DOUBLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Mist and Safeguard } } -DOUBLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Stealth Rock and Sticky Web from player's side") +DOUBLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Stealth Rock and Sticky Web from player's side (Gen 6+)") { u16 move; @@ -154,13 +154,15 @@ DOUBLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Stealth Rock and S if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("Foe Wobbuffet's evasiveness fell!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The sticky web has disappeared from the ground around your team!"); + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { + MESSAGE("The pointed stones disappeared from around your team!"); + MESSAGE("The sticky web has disappeared from the ground around your team!"); + } } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG) { + if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); MESSAGE("Wobbuffet was caught in a Sticky Web!"); @@ -198,12 +200,13 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Spikes from player if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("Foe Wobbuffet's evasiveness fell!"); - MESSAGE("The spikes disappeared from the ground around your team!"); + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + MESSAGE("The spikes disappeared from the ground around your team!"); } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG) { + if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { HP_BAR(player); MESSAGE("Wobbuffet is hurt by spikes!"); } @@ -216,7 +219,7 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Spikes from player } } -SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes terrain") +SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes terrain (Gen 8+)") { u16 move; @@ -225,7 +228,6 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes terrain") PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } GIVEN { - ASSUME(B_DEFOG_CLEARS_TERRAIN >= GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -235,19 +237,29 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes terrain") ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Wobbuffet's evasiveness fell!"); - if (move == MOVE_PSYCHIC_TERRAIN) { - MESSAGE("The weirdness disappeared from the battlefield."); + if (B_DEFOG_EFFECT_CLEARING >= GEN_8) { + if (move == MOVE_PSYCHIC_TERRAIN) { + MESSAGE("The weirdness disappeared from the battlefield."); + } + else if (move == MOVE_ELECTRIC_TERRAIN) { + MESSAGE("The electricity disappeared from the battlefield."); + } + else if (move == MOVE_MISTY_TERRAIN) { + MESSAGE("The mist disappeared from the battlefield."); + } + else if (move == MOVE_GRASSY_TERRAIN) { + MESSAGE("The grass disappeared from the battlefield."); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG, player); + } else { + NONE_OF { + MESSAGE("The weirdness disappeared from the battlefield."); + MESSAGE("The electricity disappeared from the battlefield."); + MESSAGE("The mist disappeared from the battlefield."); + MESSAGE("The grass disappeared from the battlefield."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG, player); + } } - else if (move == MOVE_ELECTRIC_TERRAIN) { - MESSAGE("The electricity disappeared from the battlefield."); - } - else if (move == MOVE_MISTY_TERRAIN) { - MESSAGE("The mist disappeared from the battlefield."); - } - else if (move == MOVE_GRASSY_TERRAIN) { - MESSAGE("The grass disappeared from the battlefield."); - } - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG, player); } } @@ -270,11 +282,12 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes Toxic Spikes from if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Wobbuffet's evasiveness fell!"); - MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); } // Switch happens MESSAGE("2 sent out Wobbuffet!"); - if (move != MOVE_DEFOG) { + if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { MESSAGE("Foe Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); STATUS_ICON(opponent, poison: TRUE); @@ -356,15 +369,17 @@ DOUBLE_BATTLE_TEST("Defog lowers evasiveness by 1 and removes everything it can" MESSAGE("Ally's Aurora Veil wore off!"); MESSAGE("Ally's Safeguard wore off!"); - MESSAGE("The spikes disappeared from the ground around your team!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The poison spikes disappeared from the ground around your team!"); - MESSAGE("The sticky web has disappeared from the ground around your team!"); + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { + MESSAGE("The spikes disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("The sticky web has disappeared from the ground around your team!"); - // Opponent side - MESSAGE("The spikes disappeared from the ground around the opposing team!"); - MESSAGE("The pointed stones disappeared from around the opposing team!"); - MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); - MESSAGE("The sticky web has disappeared from the ground around the opposing team!"); + // Opponent side + MESSAGE("The spikes disappeared from the ground around the opposing team!"); + MESSAGE("The pointed stones disappeared from around the opposing team!"); + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + MESSAGE("The sticky web has disappeared from the ground around the opposing team!"); + } } } From 00f8a4db157494faa4a267cffc022452b00d0cc5 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 Aug 2024 10:10:58 -0400 Subject: [PATCH 093/225] Added guide to running documentation website locally (#5059) * Added guide to running documentation website locally * Added link to mdBook's official documentation. --------- Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- docs/SUMMARY.md | 2 ++ docs/local_mdbook/index.md | 2 ++ docs/local_mdbook/ubuntu_WSL.md | 51 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 docs/local_mdbook/index.md create mode 100644 docs/local_mdbook/ubuntu_WSL.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fce328d858..0e065d018e 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -3,6 +3,8 @@ - [README](./README.md) - [Installation](./INSTALL.md) - [Setting up WSL1 (Legacy Portion)](./legacy_WSL1_INSTALL.md) +- [Run documentation site locally](local_mdbook/index.md) + - [Ubuntu WSL1/WSL2](local_mdbook/ubuntu_WSL.md) - [AI Flags](./ai_flags.md) - [Tutorials]() - [How to add new AI Flags](./ai_logic.md) diff --git a/docs/local_mdbook/index.md b/docs/local_mdbook/index.md new file mode 100644 index 0000000000..ef362dc45f --- /dev/null +++ b/docs/local_mdbook/index.md @@ -0,0 +1,2 @@ +## Running documentation website locally +- [Ubuntu WSL1/WSL2](/docs/local_mdbook/ubuntu_WSL.md) diff --git a/docs/local_mdbook/ubuntu_WSL.md b/docs/local_mdbook/ubuntu_WSL.md new file mode 100644 index 0000000000..88ee2468e6 --- /dev/null +++ b/docs/local_mdbook/ubuntu_WSL.md @@ -0,0 +1,51 @@ +Note: For further information beyond this very basic guide, please visit mdBook's [official documentation](https://rust-lang.github.io/mdBook/). + +## Running documentation website locally (Ubuntu WSL1/WSL2) +### Previous Requirements: +- Option 1: Install via Rust toolchain + - Install Rust toolchain if you don't have it via the `sudo apt install cargo` command. + - Install mdBook via the `cargo install mdbook` command. Once finished, this message will pop up, with {USER} being your Ubuntu + ``` + warning: be sure to add `/home/{USER}/.cargo/bin` to your PATH to be able to run the installed binaries + ``` + - Add `/home/{USER}/.cargo/bin` to your PATH (with {USER} being the Ubuntu username.) + - Run command `nano ~/.profile` to edit the file. + - Add the following lines, ***replacing {USER} with your Linux username.*** + ```diff + # set PATH so it includes user's private bin if it exists + if [ -d "$HOME/bin" ] ; then + PATH="$HOME/bin:$PATH" + fi + + # set PATH so it includes user's private bin if it exists + if [ -d "$HOME/.local/bin" ] ; then + PATH="$HOME/.local/bin:$PATH" + fi + + +# set PATH so it includes cargo bin if it exists + +if [ -d "/home/{USER}/.cargo/bin" ] ; then + + PATH="/home/{USER}/.cargo/bin:$PATH" + +fi + ``` + - Run the `source ~/.profile` command to refresh the path in the current session. +- Option 2: Install downloaded binaries directly + - TODO: Add documentation of this process. + +### Running the website +- Navigate to the `docs` folder on the repository. +- Run `mdbook serve`. Once started, you may now open the website on your browser by going to `http://127.0.0.1:3000`. +- Every change done to the `docs` folder will be reflected with an automatic refresh. +- To stop the server and go back to the terminal, press `Ctrl + C`. + +### Modifying the website +- The navigation menu on the left is handled by `docs/SUMMARY.md`. Every file added needs to be added somewhere here in order to become visible, otherwise you'll get a 404 error. +- Any Markdown files (.md extension) added to the `docs/` directory will automatically be read by mdBook. +- To add Markdown files that are not in the `docs/` directory, you may create an empty `.md` file and add the following ***without the "----"***: + ```md + {{ ----#include ../INSTALL.md}}` + ``` + This will include the `INSTALL.md` Markdown file from the root directory. + +Once you're set up, you can now check your changes before pushing them to your repo! :D + +We hope that this will make it easier for users to contribute to the documentation :) From fde85e9357bf30493ed81dda3c002006cc60ddc9 Mon Sep 17 00:00:00 2001 From: Sadfish the Sad Date: Wed, 14 Aug 2024 11:20:18 -0400 Subject: [PATCH 094/225] some gen 9 move anims + fickle beam rework (#5159) * new move anims + fickle beam rework * more fickle beam changes * removed the true for consistency * ficklebeamboosted gets cleared now * mortal spin and thunderclap changes * minor mortal spin pal change * removed hex numbers and made hard press quicker --- asm/macros/battle_script.inc | 4 + data/battle_anim_scripts.s | 632 +++++++++++++++++- data/battle_scripts_1.s | 13 + graphics/battle_anims/sprites/beam.png | Bin 0 -> 383 bytes graphics/battle_anims/sprites/blood_moon.png | Bin 0 -> 714 bytes .../battle_anims/sprites/purple_chain.png | Bin 0 -> 622 bytes .../battle_anims/sprites/red_explosion.png | Bin 0 -> 946 bytes include/battle.h | 1 + include/battle_anim.h | 1 + include/battle_scripts.h | 2 + include/constants/battle_anim.h | 4 + include/constants/battle_string_ids.h | 3 +- include/graphics.h | 8 + src/battle_anim_effects_1.c | 27 + src/battle_anim_new.c | 66 ++ src/battle_message.c | 2 + src/battle_script_commands.c | 17 + src/battle_util.c | 2 +- src/data/battle_anim.h | 8 + src/data/battle_move_effects.h | 2 +- src/graphics.c | 12 + 21 files changed, 786 insertions(+), 18 deletions(-) create mode 100644 graphics/battle_anims/sprites/beam.png create mode 100644 graphics/battle_anims/sprites/blood_moon.png create mode 100644 graphics/battle_anims/sprites/purple_chain.png create mode 100644 graphics/battle_anims/sprites/red_explosion.png diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 12439efc4a..9d61889b40 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1670,6 +1670,10 @@ callnative BS_DamageToQuarterTargetHP .endm + .macro ficklebeamdamagecalculation + callnative BS_FickleBeamDamageCalculation + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index f842b8c113..2f1a3cb73c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -16219,6 +16219,12 @@ Move_RAGING_BULL:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ANGER loadspritegfx ANIM_TAG_BREATH + loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL + loadspritegfx ANIM_TAG_TORN_METAL + choosetwoturnanim RagingBullNormal, RagingBullShatteredWall +RagingBullNormal: + monbg ANIM_TARGET + setalpha 12, 8 createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2 loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2 createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28 @@ -16250,6 +16256,49 @@ Move_RAGING_BULL:: waitforvisualfinish restorebg waitbgfadein + clearmonbg ANIM_TARGET + end +RagingBullShatteredWall: + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2 + loopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2 + createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28 + delay 20 + createsprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28 + waitforvisualfinish + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + call SetImpactBackground + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + createsprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + delay 20 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + delay 20 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -8, -12 + createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 8, -12 + createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 2, -8, 12 + createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 3, 8, 12 + playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + restorebg + waitbgfadein + clearmonbg ANIM_TARGET end @ Credits to Z-nogyroP. Simple anim that combines Force Palm + Fake Out @@ -17013,44 +17062,597 @@ Move_AXE_KICK:: createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 end +Move_SPIN_OUT:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_RAPID_SPIN + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + waitforvisualfinish + call SetHighSpeedBg + loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 3 + waitforvisualfinish + monbg ANIM_ATTACKER + createsprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2 + createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0 + loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + delay 8 + createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1 + loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 + waitforvisualfinish + call UnsetHighSpeedBg + clearmonbg ANIM_ATTACKER + end + +Move_MORTAL_SPIN:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_RAPID_SPIN + loadspritegfx ANIM_TAG_POISON_BUBBLE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_RAPID_SPIN, 0, 6, 6, RGB(15, 0, 15) + monbg ANIM_ATTACKER + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 0, 13, RGB(10, 2, 19) + delay 16 + createsprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2 + createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0 + loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 13, 0, RGB(10, 2, 19) + call PoisonBubblesEffect + waitforvisualfinish + delay 8 + createvisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1 + loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + +Move_FILLET_AWAY:: + loadspritegfx ANIM_TAG_CUT + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER + delay 5 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 20, -27, 0 + playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER + delay 5 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 60, -37, 0 + playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x7FFF + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 4, 4 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x7FFF + waitforvisualfinish + blendoff + end + +Move_FLOWER_TRICK:: + loadspritegfx ANIM_TAG_SPOTLIGHT + loadspritegfx ANIM_TAG_LEAF @leaves + loadspritegfx ANIM_TAG_FLOWER @flowers + loadspritegfx ANIM_TAG_IMPACT + createvisualtask AnimTask_CreateSpotlight, 2 + createvisualtask AnimTask_HardwarePaletteFade, 2, (BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN), 3, 0, 10, FALSE + waitforvisualfinish + createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8 + delay 16 + createvisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET + createvisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 5, ANIM_TARGET + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 + createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 + createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, 192, -160, 40 + createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, -192, -112, 40 + createsprite gTropKickFlowerTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40 + createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 + createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + createvisualtask AnimTask_HardwarePaletteFade, 2, (BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN), 3, 10, 0, TRUE + createvisualtask AnimTask_RemoveSpotlight, 2 + end + +Move_MAKE_IT_RAIN:: + loadspritegfx ANIM_TAG_COIN + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + createsprite gCoinThrowSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 1152 + waitforvisualfinish + playsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2 + createsprite gFallingCoinSpriteTemplate, ANIM_ATTACKER, 2 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 + waitforvisualfinish + delay 20 + createvisualtask AnimTask_IsTargetPlayerSide, 2 + jumpretfalse MakingItRainOnOpponent + jumprettrue MakingItRainOnPlayer +MakingItRainContinue: + waitbgfadeout + createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 11, 1 + loopsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET, 8, 15 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -5, 0, -5, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 5, 0, 6, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 19, 0, 10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -23, 0, -10, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 5, 50, 1 + call MakingItRain + call MakingItRain + call MakingItRain + restorebg + waitbgfadein + blendoff + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end +MakingItRainOnOpponent: + fadetobg BG_IMPACT_OPPONENT + goto MakingItRainContinue +MakingItRainOnPlayer: + fadetobg BG_IMPACT_PLAYER + goto MakingItRainContinue +MakingItRain: + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 28, 0, 10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -10, 0, -5, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 10, 0, 6, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 24, 0, 10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -32, 0, -10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 + delay 2 + createsprite gMakingItRainTemplate, ANIM_TARGET, 2, 30, 0, 10, 1 + delay 2 + return + +Move_SHED_TAIL:: + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 3 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 3 + waitforvisualfinish + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_MonToSubstitute, 2 + end + +Move_HYPER_DRILL:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HORN_HIT + fadetobgfromset BG_GUILLOTINE_OPPONENT, BG_GUILLOTINE_PLAYER, BG_GUILLOTINE_CONTESTS + waitbgfadein + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 12 + waitforvisualfinish + playse 20 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 2, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, 3, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, -5, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 4, -12, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 16, 0, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, 18, 1, 3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -17, 12, 1, 2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -21, -15, 1, 2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -27, 1, 2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 0, 1, 2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 4 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 + restorebg + waitbgfadein + blendoff + end + +Move_TWIN_BEAM:: + loadspritegfx ANIM_TAG_BLUE_RING + loadspritegfx ANIM_TAG_GOLD_RING + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + call SetPsychicBackground + createvisualtask AnimTask_StartSinAnimTimer, 5, 100 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_TELEPORT, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 9, 0, 10 + call PsywaveRings + call PsybeamRings + call PsywaveRings + call PsybeamRings + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(31, 18, 31) + call PsywaveRings + call PsybeamRings + call PsywaveRings + call PsybeamRings + call PsywaveRings + call PsybeamRings + call PsywaveRings + call PsybeamRings + waitforvisualfinish + delay 1 + call UnsetPsychicBg + end + +Move_COMEUPPANCE:: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + fadetobg BG_DARK + waitbgfadein + delay 0 + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED + waitforvisualfinish + delay 10 + createvisualtask AnimTask_SwayMon, 5, 0, 16, 6144, 8, ANIM_ATTACKER + delay 5 + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + restorebg + waitbgfadein + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_BLOOD_MOON:: + loadspritegfx ANIM_TAG_BLOOD_MOON + loadspritegfx ANIM_TAG_BEAM + loadspritegfx ANIM_TAG_RED_EXPLOSION + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 16, 16, RGB_BLACK + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER + delay 8 + playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER + createsprite gMoonUpSpriteTemplate, ANIM_ATTACKER, 2 + waitforvisualfinish + delay 15 + playsewithpan SE_M_DETECT, 0 + waitforvisualfinish + createvisualtask AnimTask_IsTargetPlayerSide, 2 + jumpargeq 7 ANIM_TARGET BloodMoonOnPlayer +BloodMoonOnOpponent: + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 10, 0, 5 + call BloodMoonOnslaughtOpponent + call BloodMoonOnslaughtOpponent + call BloodMoonOnslaughtOpponent + call BloodMoonOnslaughtOpponent + call BloodMoonOnslaughtOpponent + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 0 + waitforvisualfinish + goto BloodMoonFinish +BloodMoonOnPlayer: + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 10, 0, 5 + call BloodMoonOnslaughtPlayer + call BloodMoonOnslaughtPlayer + call BloodMoonOnslaughtPlayer + call BloodMoonOnslaughtPlayer + call BloodMoonOnslaughtPlayer + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + delay 0 + waitforvisualfinish +BloodMoonFinish: + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 0, 0, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end +BloodMoonOnslaughtOpponent: + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 140, -16, 165, 40, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + delay 0 + return +BloodMoonOnslaughtPlayer: + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 0 + createsprite gBloodMoonOnslaughtSpriteTemplate, ANIM_TARGET, 2, 40, -16, 75, 80, 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gRedExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + delay 0 + return + +Move_FICKLE_BEAM:: + createvisualtask AnimTask_IsPowerOver99, 2 + waitforvisualfinish + jumpreteq FALSE, FickleBeamRegular + jumpreteq TRUE, FickleBeamIntense +FickleBeamRegular: + loadspritegfx ANIM_TAG_GOLD_RING + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15 + call PsybeamRings + call PsybeamRings + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 25, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(15, 8, 30) + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + call PsybeamRings + waitforvisualfinish + end +FickleBeamIntense: + loadspritegfx ANIM_TAG_ORBS + fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT + waitbgfadein + delay 10 + playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 4, 1 + waitforvisualfinish + delay 30 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + waitforvisualfinish + restorebg + waitbgfadein + end + +Move_THUNDERCLAP:: + loadspritegfx ANIM_TAG_LIGHTNING + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 + createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + delay 4 + playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 0 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 + delay 10 + createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 3, 16, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + waitforvisualfinish + end + +Move_HARD_PRESS:: + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_ACUPRESSURE + loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE + setalpha 15, 0 + call SetSteelBeamBackground + createvisualtask AnimTask_CompressTargetHorizontallyFast, 2 + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0, 0, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 24, -24, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, -16, 16, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, -24, -12, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1 + waitforvisualfinish + blendoff + call UnsetHighSpeedBg + end + +Move_DRAGON_CHEER:: + loadspritegfx ANIM_TAG_NOISE_LINE + loadspritegfx ANIM_TAG_CONFETTI + loadspritegfx ANIM_TAG_PINK_CLOUD + createvisualtask AnimTask_DeepInhale, 2, ANIM_ATTACKER + delay 12 + call RoarEffect + createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 3 + waitforvisualfinish + monbg ANIM_ATTACKER + playsewithpan SE_BALL_OPEN, SOUND_PAN_TARGET + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 122, 3, -14, 18, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 121, 3, 14, 6, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 120, 3, -12, 12, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 119, 3, 14, 18, 24 + createsprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 118, 3, 0, 0, 24 + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + call CreateFlatterConfetti + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 10 + end + +Move_MALIGNANT_CHAIN:: + loadspritegfx ANIM_TAG_PURPLE_CHAIN + loadspritegfx ANIM_TAG_POISON_BUBBLE + loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 2 + createsprite gChainBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 1 + delay 7 + createsprite gChainBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 1 + delay 3 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 + delay 20 + setarg 7, -1 + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + waitforvisualfinish + call PoisonBubblesEffect + waitforvisualfinish + end + Move_TERA_BLAST:: Move_ORDER_UP:: -Move_SPIN_OUT:: Move_POPULATION_BOMB:: Move_GLAIVE_RUSH:: Move_REVIVAL_BLESSING:: Move_SALT_CURE:: Move_TRIPLE_DIVE:: -Move_MORTAL_SPIN:: Move_DOODLE:: -Move_FILLET_AWAY:: -Move_FLOWER_TRICK:: -Move_MAKE_IT_RAIN:: Move_RUINATION:: Move_COLLISION_COURSE:: Move_ELECTRO_DRIFT:: -Move_SHED_TAIL:: -Move_HYPER_DRILL:: -Move_TWIN_BEAM:: Move_ARMOR_CANNON:: -Move_COMEUPPANCE:: Move_BLAZING_TORQUE:: Move_WICKED_TORQUE:: Move_NOXIOUS_TORQUE:: Move_COMBAT_TORQUE:: Move_MAGICAL_TORQUE:: Move_PSYBLADE:: -Move_BLOOD_MOON:: Move_MATCHA_GOTCHA:: Move_TERA_STARSTORM:: -Move_FICKLE_BEAM:: -Move_THUNDERCLAP:: Move_MIGHTY_CLEAVE:: Move_TACHYON_CUTTER:: -Move_HARD_PRESS:: -Move_DRAGON_CHEER:: Move_SUPERCELL_SLAM:: -Move_MALIGNANT_CHAIN:: end @to do @@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@ diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index beb3bd5423..a366055658 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -30,6 +30,19 @@ BattleScript_DamageToQuarterTargetHP:: damagetoquartertargethp goto BattleScript_HitFromAtkAnimation +BattleScript_EffectFickleBeam:: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + ficklebeamdamagecalculation + goto BattleScript_HitFromCritCalc +BattleScript_FickleBeamDoubled:: + pause B_WAIT_TIME_SHORTEST + printstring STRINGID_FICKLEBEAMDOUBLED + waitmessage B_WAIT_TIME_LONG + goto BattleScript_HitFromCritCalc + BattleScript_Terastallization:: @ TODO: no string prints in S/V, but right now this helps with clarity printstring STRINGID_PKMNSTORINGENERGY diff --git a/graphics/battle_anims/sprites/beam.png b/graphics/battle_anims/sprites/beam.png new file mode 100644 index 0000000000000000000000000000000000000000..cce0a23a4c2951b215346f396b1507507a15b1bf GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e_7YEDSN0bijKaDyQ(Rb*fI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0z;le!RLk zxyZZv*Y1P$ncuIQyl8N|z}&om-AKcMjkV(e%e~7FSo$Ib9C(=w7}XB2%wP~sVDf3; zG+>lwv}V+1}`-{yl(%&x`9K0QOSX&gF#S%iOrEeC7^+aOTdv;X$4U83P%Q* elnYE<1OJkYPN(I-ViM0_5DRAz|C${4tFacO8x{0q zF8T!&VNCLNclp1R{nJq(`<EQwELoyM)whc?AdYImMwNGGt{d`_@dRFMxWl60w+9T}0@`PntHC*N4+QhZ}^}>$} zUA~rjv!~t9`}SOM+UkYr&3y)LjI(~9{qUP7BI8+Dw6vz&+$DcDR-S24$Ul-Q=^9-1 zQIa9|sc+_Tmn)5tKZ_q6lh9AzaQjD~`#2D{M1rPkks_(7Pt=+oT3AAB|)swWlejMGPSdCo6WjMxJ&tP7oBydmNb4 zmFF(CiQ}k|hWAI)pA%Eoe(t%nxOC+~5p|{LR=w}tS_-O7YKkeUX$PFNrMEwteBxzf z`=Se78kbJq+jaGh{GOly|_W^~( zOI#yLg7ec#$`gxH8QgtbfW|14r4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5}rL4Z$)E0CVxJT1{6^1NsE9Gi+uh~=Qua?rf$T}1 zE{-7;bKXv`%{#2Xb2Rrm(~TI0nx+YN{^u1hS$OG);jJZkSHryjYWwql{#X~#Q2sY& zp&!f6sW%p6_VNlHZDQNlAhuuwd(@;Q0Sc#6W+@f+N0`bmvS`XBs&>grC2+FtoDz}X zE7q%`vPed6YL;%H^a`$zNw3}n%yhMA(X{yYZ{75j^-L2=jeO@asmL+rX-PT`c7Be>uGNp2^CJokY(FI)XYApu ze$wp3X4Ud$B7gPi_GR)v5)9jdFDuKxd9LzDyJp9oZRsB!@AS15rt^E2thD61^kgB& z>obYE8x=k;IcZaQ@Lu2-JXNj1Ie_Iq{0*X&hS3j3^P6Ix5ep^rs7ykeNw;N&Jv-(G1^&lK49K#VLV{6@ymTg8_T?CV)fbv{iZOEQr6<8Zh4pagJeI zWjyj@Oza6Mg!p8a}c_n=cbfOgCvX2DzvR_)^*b)HePr>?s7j7MbQ(; zRNR;4AwT*QMVUN+Xp@-OeXHbk#-_|U+@s%~8FluJd}mInfHfs_@j!^tusJqLs)N^) z^s6&SUZ<4;VF#X8LJd~f+iWZVMyWq=4uJhe16EF~y%>Tr%ygHWe5@-yH-Plh5R^^( zwRfjC3kw6SeP{#uH#x3X|tU887u(&=6Bbm; z)$i3f6#9NRAGj=>kM_7VBkg2aoz=lYlU?sP4)in3$3Ia&xtPO{3Rq*K5%@*k-CqEI zymIv%48U;7`564S$Z7{b&ByOlS^0>n`^1*@Nv*^EAS59rK=jh)LH-yF!}sIx11ZDd Ux%QAR^#A|>07*qoM6N<$g6eam;{X5v literal 0 HcmV?d00001 diff --git a/include/battle.h b/include/battle.h index fdc9575b24..1d60aacec1 100644 --- a/include/battle.h +++ b/include/battle.h @@ -800,6 +800,7 @@ struct BattleStruct u8 distortedTypeMatchups; u8 categoryOverride; // for Z-Moves and Max Moves u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side + u8 fickleBeamBoosted:1; }; // The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, diff --git a/include/battle_anim.h b/include/battle_anim.h index ce9749685e..6ff7e9ff22 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -253,6 +253,7 @@ void AnimParticleBurst(struct Sprite *); void AnimPowerAbsorptionOrb(struct Sprite *sprite); void AnimNeedleArmSpike(struct Sprite *); void AnimTask_CompressTargetHorizontally(u8 taskId); +void AnimTask_CompressTargetHorizontallyFast(u8 taskId); void AnimSporeParticle(struct Sprite *sprite); void AnimAbsorptionOrb(struct Sprite *sprite); void AnimPetalDanceSmallFlower(struct Sprite *sprite); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 0c9f72c276..6bdb88b28f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -843,5 +843,7 @@ extern const u8 BattleScript_EffectUpperHand[]; extern const u8 BattleScript_EffectTidyUp[]; extern const u8 BattleScript_EffectSpicyExtract[]; extern const u8 BattleScript_DamageToQuarterTargetHP[]; +extern const u8 BattleScript_EffectFickleBeam[]; +extern const u8 BattleScript_FickleBeamDoubled[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 389cd7e127..54573a4868 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -412,6 +412,10 @@ #define ANIM_TAG_TERA_CRYSTAL (ANIM_SPRITES_START + 398) #define ANIM_TAG_TERA_SHATTER (ANIM_SPRITES_START + 399) #define ANIM_TAG_DREEPY_SHINY (ANIM_SPRITES_START + 400) +#define ANIM_TAG_BLOOD_MOON (ANIM_SPRITES_START + 401) +#define ANIM_TAG_BEAM (ANIM_SPRITES_START + 402) +#define ANIM_TAG_RED_EXPLOSION (ANIM_SPRITES_START + 403) +#define ANIM_TAG_PURPLE_CHAIN (ANIM_SPRITES_START + 404) // battlers #define ANIM_ATTACKER 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 1e6e2d86d7..9529e026c1 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -712,8 +712,9 @@ #define STRINGID_FOGISDEEP 710 #define STRINGID_FOGLIFTED 711 #define STRINGID_PKMNMADESHELLGLEAM 712 +#define STRINGID_FICKLEBEAMDOUBLED 713 -#define BATTLESTRINGS_COUNT 713 +#define BATTLESTRINGS_COUNT 714 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/include/graphics.h b/include/graphics.h index 01de060b79..4cb944af8a 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2724,6 +2724,8 @@ extern const u32 gBattleAnimSpritePal_AuraSphere[]; extern const u32 gBattleAnimSpritePal_AvalancheRocks[]; extern const u32 gBattleAnimSpriteGfx_NewPokeball[]; extern const u32 gBattleAnimSpritePal_NewPokeball[]; +extern const u32 gBattleAnimSpriteGfx_Beam[]; +extern const u32 gBattleAnimSpritePal_Beam[]; extern const u32 gBattleAnimSpriteGfx_BerryEaten[]; extern const u32 gBattleAnimSpritePal_BerryEaten[]; extern const u32 gBattleAnimSpriteGfx_BerryNormal[]; @@ -2732,6 +2734,8 @@ extern const u32 gBattleAnimSpriteGfx_BigRock[]; extern const u32 gBattleAnimSpritePal_BigRock[]; extern const u32 gBattleAnimSpriteGfx_BlacephalonHead[]; extern const u32 gBattleAnimSpritePal_BlacephalonHead[]; +extern const u32 gBattleAnimSpriteGfx_BloodMoon[]; +extern const u32 gBattleAnimSpritePal_BloodMoon[]; extern const u32 gBattleAnimSpritePal_BlueFlare[]; extern const u32 gBattleAnimSpriteGfx_Branch[]; extern const u32 gBattleAnimSpritePal_Branch[]; @@ -2825,12 +2829,16 @@ extern const u32 gBattleAnimSpriteGfx_PoisonColumn[]; extern const u32 gBattleAnimSpritePal_PoisonColumn[]; extern const u32 gBattleAnimSpriteGfx_PowerTrick[]; extern const u32 gBattleAnimSpritePal_PowerTrick[]; +extern const u32 gBattleAnimSpriteGfx_PurpleChain[]; +extern const u32 gBattleAnimSpritePal_PurpleChain[]; 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_RedExplosion[]; +extern const u32 gBattleAnimSpritePal_RedExplosion[]; extern const u32 gBattleAnimSpriteGfx_RocksSmall[]; extern const u32 gBattleAnimSpriteGfx_NewRocks[]; extern const u32 gBattleAnimSpritePal_NewRocks[]; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index b917cdc9a5..d8283fc7dc 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -3101,6 +3101,17 @@ const struct SpriteTemplate gPsyshockSmokeSpriteTemplate = .callback = AnimSpriteOnMonPos, }; +const struct SpriteTemplate gChainBindingSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_CHAIN, + .paletteTag = ANIM_TAG_PURPLE_CHAIN, + .oam = &gOamData_AffineNormal_ObjNormal_64x32, + .anims = sAnims_ConstrictBinding, + .images = NULL, + .affineAnims = sAffineAnims_ConstrictBinding, + .callback = AnimConstrictBinding, +}; + // functions static void AnimGrassKnot(struct Sprite *sprite) { @@ -7229,6 +7240,14 @@ static const union AffineAnimCmd sCompressTargetHorizontallyAffineAnimCmds[] = AFFINEANIMCMD_END, }; +static const union AffineAnimCmd sCompressTargetHorizontallyAffineAnimCmdsFast[] = +{ + AFFINEANIMCMD_FRAME(32, 0, 0, 16), //Compress + AFFINEANIMCMD_FRAME(0, 0, 0, 32), + AFFINEANIMCMD_FRAME(-32, 0, 0, 16), + AFFINEANIMCMD_END, +}; + static void AnimTask_CompressTargetStep(u8 taskId) { struct Task* task = &gTasks[taskId]; @@ -7245,6 +7264,14 @@ void AnimTask_CompressTargetHorizontally(u8 taskId) task->func = AnimTask_CompressTargetStep; } +void AnimTask_CompressTargetHorizontallyFast(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); + PrepareAffineAnimInTaskData(task, spriteId, sCompressTargetHorizontallyAffineAnimCmdsFast); + task->func = AnimTask_CompressTargetStep; +} + void AnimTask_CreateSmallSteelBeamOrbs(u8 taskId) { if (--gTasks[taskId].data[0] == -1) diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index f023859b59..cd89b6aab7 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -99,6 +99,7 @@ static void SpriteCB_GlacialLance_Step1(struct Sprite* sprite); static void SpriteCB_GlacialLance_Step2(struct Sprite* sprite); static void SpriteCB_GlacialLance(struct Sprite* sprite); static void SpriteCB_TripleArrowKick(struct Sprite* sprite); +static void AnimMakingItRain(struct Sprite *sprite); // const data // general @@ -7234,6 +7235,51 @@ const struct SpriteTemplate gBitterBladeImpactTemplate = .callback = AnimClawSlash }; +// Make It Rain +const struct SpriteTemplate gMakingItRainTemplate = +{ + .tileTag = ANIM_TAG_COIN, + .paletteTag = ANIM_TAG_COIN, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gCoinAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMakingItRain, +}; + +const struct SpriteTemplate gRedExplosionSpriteTemplate = +{ + .tileTag = ANIM_TAG_RED_EXPLOSION, + .paletteTag = ANIM_TAG_RED_EXPLOSION, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gBloodMoonOnslaughtSpriteTemplate = +{ + .tileTag = ANIM_TAG_BEAM, + .paletteTag = ANIM_TAG_BEAM, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sArrowRaidOnslaughtAffineAnimTable, + .callback = AnimAssistPawprint +}; + +const struct SpriteTemplate gMoonUpSpriteTemplate = +{ + .tileTag = ANIM_TAG_BLOOD_MOON, + .paletteTag = ANIM_TAG_BLOOD_MOON, + .oam = &gOamData_AffineOff_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWeatherBallUp, +}; + // functions //general void AnimTask_IsTargetPartner(u8 taskId) @@ -9219,3 +9265,23 @@ void AnimTask_StickySyrup(u8 taskId) gBattleAnimArgs[0] = gAnimDisableStructPtr->syrupBombIsShiny; DestroyAnimVisualTask(taskId); } + +static void AnimMakingItRain(struct Sprite *sprite) +{ + if (gBattleAnimArgs[3] != 0) + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->x, &sprite->y); //coin shower on target + + sprite->x += gBattleAnimArgs[0]; + sprite->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 = TranslateSpriteInEllipse; + sprite->callback(sprite); +} diff --git a/src/battle_message.c b/src/battle_message.c index 87ac5326fb..497e617601 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -849,9 +849,11 @@ static const u8 sText_ShedItsTail[] = _("{B_ATK_NAME_WITH_PREFIX} shed its tail\ static const u8 sText_PkmnTerastallizedInto[] = _("{B_ATK_NAME_WITH_PREFIX} terastallized\ninto the {B_BUFF1} type!"); static const u8 sText_SupersweetAromaWafts[] = _("A supersweet aroma is wafting from\nthe syrup covering {B_ATK_NAME_WITH_PREFIX}!"); static const u8 sText_TidyingUpComplete[] = _("Tidying up complete!"); +static const u8 sText_FickleBeamDoubled[] = _("{B_ATK_NAME_WITH_PREFIX} is going all\nout for this attack!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_FICKLEBEAMDOUBLED - BATTLESTRINGS_TABLE_START] = sText_FickleBeamDoubled, [STRINGID_PKMNTERASTALLIZEDINTO - BATTLESTRINGS_TABLE_START] = sText_PkmnTerastallizedInto, [STRINGID_TIDYINGUPCOMPLETE - BATTLESTRINGS_TABLE_START] = sText_TidyingUpComplete, [STRINGID_SUPERSWEETAROMAWAFTS - BATTLESTRINGS_TABLE_START] = sText_SupersweetAromaWafts, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8056b3ddf2..afc63fed9b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6402,6 +6402,7 @@ static void Cmd_moveend(void) gBattleStruct->enduredDamage = 0; gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; + gBattleStruct->fickleBeamBoosted = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); gBattleStruct->distortedTypeMatchups = 0; @@ -17132,3 +17133,19 @@ void BS_DamageToQuarterTargetHP(void) gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_FickleBeamDamageCalculation(void) +{ + NATIVE_ARGS(); + gBattleStruct->fickleBeamBoosted = FALSE; + + if (RandomPercentage(RNG_FICKLE_BEAM, 30)) + { + gBattleStruct->fickleBeamBoosted = TRUE; + gBattlescriptCurrInstr = BattleScript_FickleBeamDoubled; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/src/battle_util.c b/src/battle_util.c index 3be34d1afc..71f6e3581b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9073,7 +9073,7 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 basePower = (basePower > 350) ? 350 : basePower; break; case EFFECT_FICKLE_BEAM: - if (RandomPercentage(RNG_FICKLE_BEAM, 30)) + if (gBattleStruct->fickleBeamBoosted) basePower *= 2; break; case EFFECT_TERA_BLAST: diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index ec98ecd854..72a3c7121b 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1461,6 +1461,10 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_TeraCrystal, 0x800, ANIM_TAG_TERA_CRYSTAL}, {gBattleAnimSpriteGfx_TeraShatter, 0x0180, ANIM_TAG_TERA_SHATTER}, {gBattleAnimSpriteGfx_DreepyMissile, 0x200, ANIM_TAG_DREEPY_SHINY}, + {gBattleAnimSpriteGfx_BloodMoon, 0x0800, ANIM_TAG_BLOOD_MOON}, + {gBattleAnimSpriteGfx_RedExplosion, 0x0800, ANIM_TAG_RED_EXPLOSION}, + {gBattleAnimSpriteGfx_Beam, 0x0800, ANIM_TAG_BEAM}, + {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1923,6 +1927,10 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_TeraCrystal, ANIM_TAG_TERA_CRYSTAL}, {gBattleAnimSpritePal_TeraShatter, ANIM_TAG_TERA_SHATTER}, {gBattleAnimSpritePal_DreepyMissileShiny, ANIM_TAG_DREEPY_SHINY}, + {gBattleAnimSpritePal_BloodMoon, ANIM_TAG_BLOOD_MOON}, + {gBattleAnimSpritePal_RedExplosion, ANIM_TAG_RED_EXPLOSION}, + {gBattleAnimSpritePal_Beam, ANIM_TAG_BEAM}, + {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index f970f0e9f7..ead7cee6f1 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2169,7 +2169,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FICKLE_BEAM] = { - .battleScript = BattleScript_EffectHit, + .battleScript = BattleScript_EffectFickleBeam, .battleTvScore = 0, // TODO: Assign points }, diff --git a/src/graphics.c b/src/graphics.c index c35cec3467..b1e1a91678 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -81,6 +81,9 @@ const u32 gBattleAnimSpritePal_AvalancheRocks[] = INCBIN_U32("graphics/battle_an const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.4bpp.lz"); const u32 gBattleAnimSpritePal_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.4bpp.lz"); +const u32 gBattleAnimSpritePal_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.4bpp.lz"); const u32 gBattleAnimSpritePal_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.gbapal.lz"); @@ -93,6 +96,9 @@ const u32 gBattleAnimSpritePal_BigRock[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.4bpp.lz"); const u32 gBattleAnimSpritePal_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.4bpp.lz"); +const u32 gBattleAnimSpritePal_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.gbapal.lz"); + const u32 gBattleAnimSpritePal_BlueFlare[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flare.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/branch.4bpp.lz"); @@ -233,12 +239,18 @@ const u32 gBattleAnimSpritePal_PoisonColumn[] = INCBIN_U32("graphics/battle_anim const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.4bpp.lz"); const u32 gBattleAnimSpritePal_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.4bpp.lz"); +const u32 gBattleAnimSpritePal_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.gbapal.lz"); const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.4bpp.lz"); const u32 gBattleAnimSpritePal_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.4bpp.lz"); +const u32 gBattleAnimSpritePal_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/rock_small.4bpp.lz"); const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks_new.4bpp.lz"); From 4d78d5e5075ffe4a7765b6497a86b68ff1e4644b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:07:01 +0200 Subject: [PATCH 095/225] Fixes Poltergeist missing accuracy check (#5168) --- 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 a366055658..c47127c651 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -878,6 +878,7 @@ BattleScript_OctlockTurnDmgEnd: BattleScript_EffectPoltergeist:: attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce checkpoltergeist BS_TARGET, BattleScript_ButItFailed From 9019fed264a4c2187ccf489c884cfe2b0222239f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:26:52 +0200 Subject: [PATCH 096/225] Fixes booster energy not increasing speed (#5167) * Fixes booster energy not increasing speed * alternative solution * forgot else --- src/battle_main.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 526c54d62f..e164976e9d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4717,7 +4717,6 @@ void SwapTurnOrder(u8 id1, u8 id2) u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) { u32 speed = gBattleMons[battler].speed; - u32 highestStat = GetHighestStatId(battler); // weather abilities if (WEATHER_HAS_EFFECT) @@ -4739,10 +4738,10 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && gBattleWeather & B_WEATHER_SUN && highestStat == STAT_SPEED) - speed = (speed * 150) / 100; - else if (ability == ABILITY_QUARK_DRIVE && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && highestStat == STAT_SPEED) - speed = (speed * 150) / 100; + else if (ability == ABILITY_PROTOSYNTHESIS && (gBattleWeather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_QUARK_DRIVE && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; // stat stages speed *= gStatStageRatios[gBattleMons[battler].statStages[STAT_SPEED]][0]; From e3d9bb643feac3885c5b2a4815162516161d4e30 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:27:40 +0200 Subject: [PATCH 097/225] #5120 Follow up (#5158) Consistency change --- 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 71f6e3581b..ada7cb20a3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4096,7 +4096,7 @@ static void ChooseStatBoostAnimation(u32 battler) if (gBattleScripting.animArg1 != 0) // Already set in a different stat so now boosting multiple stats gBattleScripting.animArg1 = (statBuffMoreThan1 ? STAT_ANIM_MULTIPLE_PLUS2 : STAT_ANIM_MULTIPLE_PLUS1); else - gBattleScripting.animArg1 = GET_STAT_BUFF_ID((statsOrder[stat] + 1)) + (!statBuffMoreThan1 ? STAT_ANIM_PLUS1 : STAT_ANIM_PLUS2); + gBattleScripting.animArg1 = GET_STAT_BUFF_ID((statsOrder[stat] + 1)) + (statBuffMoreThan1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); } } #undef ANIM_STAT_HP From 18980b20a3128b22ab9ba23f2a466d076e95536d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 Aug 2024 22:48:20 -0400 Subject: [PATCH 098/225] Remove trailing whitespace (master) (#5174) --- INSTALL.md | 4 +- data/battle_scripts_2.s | 2 +- .../followers/rename_to_graphics_pokemon.py | 2 +- docs/ai_flags.md | 16 +- docs/changelogs/1.5.x/1.5.2.md | 2 +- docs/changelogs/1.5.x/1.5.3.md | 4 +- docs/changelogs/1.7.x/1.7.2.md | 2 +- docs/how_to_new_pokemon_1_6_0.md | 10 +- docs/how_to_new_pokemon_1_7_0.md | 24 +-- docs/how_to_new_pokemon_1_8_0.md | 22 +-- docs/how_to_new_pokemon_1_9_0.md | 24 +-- docs/how_to_testing_system.md | 150 +++++++++--------- docs/how_to_trainer_class.md | 4 +- include/test/battle.h | 2 +- migration_scripts/1.8/item_ball_refactor.py | 2 +- .../1.9/battle_anim_moves_refactor.py | 2 +- spritesheet_rules.mk | 2 +- src/battle_anim.c | 2 +- src/battle_anim_dragon.c | 12 +- src/battle_anim_effects_1.c | 6 +- src/battle_anim_flying.c | 2 +- src/battle_anim_normal.c | 4 +- src/battle_controllers.c | 2 +- src/battle_dome.c | 8 +- src/battle_factory.c | 4 +- src/battle_factory_screen.c | 2 +- src/battle_setup.c | 2 +- src/clock.c | 2 +- src/data/gimmicks.h | 8 +- .../object_event_graphics_info_pointers.h | 2 +- src/event_object_movement.c | 10 +- src/field_specials.c | 4 +- src/load_save.c | 2 +- src/map_name_popup.c | 4 +- src/script_menu.c | 2 +- src/script_pokemon_util.c | 2 +- src/vs_seeker.c | 2 +- test/battle/ability/anger_point.c | 4 +- test/battle/ability/clear_body.c | 4 +- test/battle/ability/gulp_missile.c | 2 +- test/battle/ability/magic_guard.c | 2 +- test/battle/ai/ai_flag_risky.c | 8 +- test/battle/gimmick/terastal.c | 2 +- test/battle/gimmick/zmove.c | 4 +- test/battle/hold_effect/ability_shield.c | 2 +- test/battle/move_effect/heal_bell.c | 12 +- test/battle/move_effect/knock_off.c | 4 +- test/battle/move_effect/revelation_dance.c | 4 +- test/battle/move_effect/sleep_talk.c | 4 +- test/battle/move_effect/telekinesis.c | 2 +- tools/learnset_helpers/teachable.py | 4 +- tools/preproc/asm_file.cpp | 6 +- 52 files changed, 210 insertions(+), 210 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 6349d24fbb..5744adcb04 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -327,7 +327,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for libpng is now installed. Continue to [Installing pkg-config (macOS)](#installing-pkg-config-macos) if **pkg-config is not installed**. Otherwise, continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**. - + If both pkg-config and devkitARM are already installed, go to [Choosing where to store pokeemerald Expansion (macOS)](#choosing-where-to-store-pokeemerald-expansion-macos). ### Installing pkg-config (macOS) @@ -541,7 +541,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for > ``` > Where *\* is the path of the folder [where you chose to store pokeemerald Expansion](#Choosing-where-to-store-pokeemerald-expansion-WSL1). Then run the `git clone` command again. - + Now you're ready to build pokeemerald Expansion. ## Build pokeemerald Expansion diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 6238afb36c..7fe22195c8 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -45,7 +45,7 @@ BattleScript_UseItemMessage: printfromtable gTrainerUsedItemStringIds waitmessage B_WAIT_TIME_LONG return - + BattleScript_ItemRestoreHPRet: bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE diff --git a/dev_scripts/followers/rename_to_graphics_pokemon.py b/dev_scripts/followers/rename_to_graphics_pokemon.py index bad1758b0c..a89348ddb4 100644 --- a/dev_scripts/followers/rename_to_graphics_pokemon.py +++ b/dev_scripts/followers/rename_to_graphics_pokemon.py @@ -59,6 +59,6 @@ def rellocate_follower_graphics(): #os.popen('cp followers/' + name + '.png followers/' + name + '/follower.png') #os.remove('followers/' + name + '.png') #print(pth) - #subprocess.run(["tools/gbagfx/gbagfx " + name +".png " + name + "_normal.pal'" + str(count) + "'"]) + #subprocess.run(["tools/gbagfx/gbagfx " + name +".png " + name + "_normal.pal'" + str(count) + "'"]) rellocate_follower_graphics() diff --git a/docs/ai_flags.md b/docs/ai_flags.md index cc5c1631ff..bb7b1b7444 100644 --- a/docs/ai_flags.md +++ b/docs/ai_flags.md @@ -21,14 +21,14 @@ AI: Check Bad Move / Try to Faint / Check Viability. The name of each flag is ju * Sequence Switching ## `COMPETITIVE_PARTY_SYNTAX != TRUE` / Not Found -If you are not using competitive syntax parties, instead access the trainer data directly in [`src/data/trainers.h`](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h), and add flags like so, typed exactly the same as the flag names themselves: +If you are not using competitive syntax parties, instead access the trainer data directly in [`src/data/trainers.h`](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h), and add flags like so, typed exactly the same as the flag names themselves: `.aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY` # What AI Flags does pokeemerald-expansion have? This section lists all of expansion’s AI Flags and briefly describes the effect they have on the AI’s behaviour. In all cases, please check the corresponding function or surrounding code around their implementation for more details. Some of these functions are vanilla, some share a name with vanilla but have been modified to varying degrees, and some are completely new. ## `AI_FLAG_CHECK_BAD_MOVE` -The AI will avoid using moves that are likely to fail in the current situation. This flag helps prevent the AI from making ineffective choices, such as using moves into immunities, into invulnerable states, or when the moves are otherwise hindered by abilities, terrain, or status conditions. +The AI will avoid using moves that are likely to fail in the current situation. This flag helps prevent the AI from making ineffective choices, such as using moves into immunities, into invulnerable states, or when the moves are otherwise hindered by abilities, terrain, or status conditions. ## `AI_FLAG_TRY_TO_FAINT` AI will prioritize KOing the player if able rather than using status moves. Will prioritize using a move that can OHKO the player. If the player can KO the AI’s mon and the AI’s mon is slower, prioritize priority moves (this does not prevent the AI from switching out instead). @@ -58,12 +58,12 @@ AI will generally behave more recklessly. This AI enables the following behaviou * Prioritize Explosion moves ## `AI_FLAG_PREFER_STRONGEST_MOVE` -Adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. +Adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. Keep in mind that this is a weaker form of `AI_FLAG_TRY_TO_FAINT` at scoring OHKOs as it does not take into account who is attacking first, it does however handle 2HKOs. ## `AI_FLAG_PREFER_BATON_PASS` -AI prefers raising its own stats if it has >= 60% HP, as well as Ingrain, Aqua Ring, and Protect. Prioritizes Baton Bass if the mon is rooted (Ingrain) or has the Aqua Ring effect, and doesn’t if it has been Leech Seeded. +AI prefers raising its own stats if it has >= 60% HP, as well as Ingrain, Aqua Ring, and Protect. Prioritizes Baton Bass if the mon is rooted (Ingrain) or has the Aqua Ring effect, and doesn’t if it has been Leech Seeded. ## `AI_FLAG_DOUBLE_BATTLE` This flag is automatically set in double battles, and controls much of the doubles-specific scoring. I’ll summarize some of its scoring as follows: @@ -83,7 +83,7 @@ With respect to the AI’s mons, in doubles: In both singles and doubles: * Prioritizes not using moves that require the user fainting (Destiny Bond, Explosion etc.) and healing moves while on >= 70% HP. * Prioritize not using moves that require the user fainting or losing significant HP (Belly Drum etc) while between 30% and 70% HP -* Prioritize not using setup moves (Light Screen etc.) and Bide while on <= 30% HP +* Prioritize not using setup moves (Light Screen etc.) and Bide while on <= 30% HP With respect to the player’s mons: * Prioritize not using many status moves (stat buffs, Poison, Pain Split) if the player has between 30% and 70% HP @@ -96,7 +96,7 @@ AI prioritizes setting up field effects (Trick Room, Rain Dance, etc.) and side AI does not understand ability suppression (Mold Breaker etc., weather suppression (Air Lock etc.), redirection abilities (Lightningrod etc.) being temporarily removed due to move effects (Sky Drop etc.), or item suppression (Magic Room etc.) and will ignore them. This is a handicap flag. ## `AI_FLAG_WILL_SUICIDE` -AI prioritizes self destruction moves (Explosion, Memento). +AI prioritizes self destruction moves (Explosion, Memento). ## `AI_FLAG_PREFER_STATUS_MOVES` AI gets a score bonus for status moves. This should be combined with `AI_FLAG_CHECK_BAD_MOVE` to prevent using only status moves. @@ -127,7 +127,7 @@ Affects when the AI chooses to switch. AI will make smarter decisions about when Marks the last Pokemon in the party as the Ace Pokemon. It will not be used unless it is the last one remaining, or is forced to be switched in (Roar, U-Turn with 1 mon remaining, etc.) ## `AI_FLAG_OMNISCIENT` -AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions. +AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions. ## `AI_FLAG_SMART_MON_CHOICES` Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled. @@ -148,7 +148,7 @@ And will choose mons after a mid-battle switch prioritizing the following criter * Has Baton Pass ## `AI_FLAG_CONSERVATIVE` -AI always assumes it will roll the lowest possible result when comparing damage in scoring. +AI always assumes it will roll the lowest possible result when comparing damage in scoring. ## `AI_FLAG_SEQUENCE_SWITCHING` AI will always switch out after a KO in exactly party order as defined in the trainer data (ie. slot 1, then 2, then 3, etc.). The AI will never switch out mid-battle unless forced to (Roar etc.). If the AI uses a move that requires a switch where it makes a decision about what to send in (U-Turn etc.), it will always switch out into the lowest available party index. diff --git a/docs/changelogs/1.5.x/1.5.2.md b/docs/changelogs/1.5.x/1.5.2.md index ab6735c7a3..69e0ecaabf 100644 --- a/docs/changelogs/1.5.x/1.5.2.md +++ b/docs/changelogs/1.5.x/1.5.2.md @@ -92,5 +92,5 @@ * Court Change by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3160 * Item Effects * Utility Umbrella, by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/2835 - + **Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.5.1...expansion/1.5.2 \ No newline at end of file diff --git a/docs/changelogs/1.5.x/1.5.3.md b/docs/changelogs/1.5.x/1.5.3.md index 831814740a..85748b2375 100644 --- a/docs/changelogs/1.5.x/1.5.3.md +++ b/docs/changelogs/1.5.x/1.5.3.md @@ -9,8 +9,8 @@ ## CRITICAL FIX, please update to avoid the issues detailed down below: - Fixed memory corruption when handling trigger sprites by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3238 - This had the posibility of manifesting in weird ways, like camera and music changes, NPC duplication and more. If you've had this issue in the past, we ***heavily*** recommend you update to this version of the expansion. - - Thank you @Bassoonian for helping us pinpointing the issue. - + - Thank you @Bassoonian for helping us pinpointing the issue. + ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/26b9b984-c5db-4dac-85f7-5fc4e95a32ce) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/d490eb30-ce54-4b90-bb2e-79c2e9bb50ac) diff --git a/docs/changelogs/1.7.x/1.7.2.md b/docs/changelogs/1.7.x/1.7.2.md index 34aa131e70..a92d778956 100644 --- a/docs/changelogs/1.7.x/1.7.2.md +++ b/docs/changelogs/1.7.x/1.7.2.md @@ -41,7 +41,7 @@ * Clodsire * Crocalor * Dolliv - * Dudunsparce + * Dudunsparce * Esparthra ### Fixed * Multiple Pokémon graphical fixes by @katykat5099 in https://github.com/rh-hideout/pokeemerald-expansion/pull/3805 diff --git a/docs/how_to_new_pokemon_1_6_0.md b/docs/how_to_new_pokemon_1_6_0.md index d965e48a5f..9bf3e2e61f 100644 --- a/docs/how_to_new_pokemon_1_6_0.md +++ b/docs/how_to_new_pokemon_1_6_0.md @@ -384,7 +384,7 @@ Edit [src/data/text/species_names.h](https://github.com/rh-hideout/pokeemerald-e const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = { [SPECIES_NONE] = _("??????????"), [SPECIES_BULBASAUR] = _("Bulbasaur"), - ... + ... [SPECIES_ENAMORUS] = _("Enamorus"), + [SPECIES_MEWTHREE] = _("Mewthree"), }; @@ -482,7 +482,7 @@ Append to [src/data/pokemon/pokedex_text.h](https://github.com/rh-hideout/pokeem "winter. According to legend, this\n" "Pokémon's love gives rise to the\n" "budding of fresh life across the land."); - + +const u8 gMewthreePokedexText[] = _( + "The rumors became true.\n" + "This is Mews final form.\n" @@ -509,7 +509,7 @@ Edit [src/data/pokemon/pokedex_entries.h](https://github.com/rh-hideout/pokeemer .trainerScale = 296, .trainerOffset = 1, }, - + + [NATIONAL_DEX_MEWTHREE] = + { + .categoryName = _("NEW SPECIES"), @@ -553,7 +553,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera NATIONAL_DEX_DUGTRIO, ... }; - + const u16 gPokedexOrder_Height[] = { ... @@ -598,7 +598,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald }, + [SPECIES_MEWTHREE] = -+ { ++ { + .baseHP = 106, + .baseAttack = 150, + .baseDefense = 70, diff --git a/docs/how_to_new_pokemon_1_7_0.md b/docs/how_to_new_pokemon_1_7_0.md index 801ae8e549..30c1f82dbe 100644 --- a/docs/how_to_new_pokemon_1_7_0.md +++ b/docs/how_to_new_pokemon_1_7_0.md @@ -170,7 +170,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald }, + [SPECIES_MEWTHREE] = -+ { ++ { + .baseHP = 106, + .baseAttack = 150, + .baseDefense = 70, @@ -234,7 +234,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -309,7 +309,7 @@ Lastly, we add the cry to our species entry { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -388,7 +388,7 @@ Now we can add the number and entry to our Mewthree: { ... [SPECIES_MEWTHREE] = - { + { ... .cryId = CRY_MEWTHREE, + .natDexNum = NATIONAL_DEX_MEWTHREE, @@ -409,7 +409,7 @@ Now we can add the number and entry to our Mewthree: ``` ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) -The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. `height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). @@ -443,7 +443,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera NATIONAL_DEX_DUGTRIO, ... }; - + const u16 gPokedexOrder_Height[] = { ... @@ -560,7 +560,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie { ... [SPECIES_MEWTHREE] = - { + { ... .pokemonScale = 256, .pokemonOffset = 0, @@ -612,7 +612,7 @@ Let's explain each of these: - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. - `backAnimId`: - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. -- `PALETTES` +- `PALETTES` - This macro was created to handle both regular and shiny palettes of a Pokémon. It just needs the species suffix to call the corresponding palette. ```c #define PALETTES(pal) \ @@ -650,7 +650,7 @@ We're almost there just a bit left! { ... [SPECIES_MEWTHREE] = - { + { ... .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PURPLE, @@ -745,7 +745,7 @@ Again, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... PALETTES(Mewthree), ICON(Mewthree, 2), @@ -846,7 +846,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... FOOTPRINT(Mewthree) .levelUpLearnset = sMewthreeLevelUpLearnset, @@ -869,7 +869,7 @@ Edit `gSpeciesInfo`: { ... [SPECIES_MEWTWO] = - { + { ... FOOTPRINT(Mewtwo) .isLegendary = TRUE, diff --git a/docs/how_to_new_pokemon_1_8_0.md b/docs/how_to_new_pokemon_1_8_0.md index c4c7ab621c..6dbb009fcf 100644 --- a/docs/how_to_new_pokemon_1_8_0.md +++ b/docs/how_to_new_pokemon_1_8_0.md @@ -181,7 +181,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald }, + [SPECIES_MEWTHREE] = -+ { ++ { + .baseHP = 106, + .baseAttack = 150, + .baseDefense = 70, @@ -245,7 +245,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -320,7 +320,7 @@ Lastly, we add the cry to our species entry { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -399,7 +399,7 @@ Now we can add the number and entry to our Mewthree: { ... [SPECIES_MEWTHREE] = - { + { ... .cryId = CRY_MEWTHREE, + .natDexNum = NATIONAL_DEX_MEWTHREE, @@ -420,7 +420,7 @@ Now we can add the number and entry to our Mewthree: ``` ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) -The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. `height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). @@ -454,7 +454,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera NATIONAL_DEX_DUGTRIO, ... }; - + const u16 gPokedexOrder_Height[] = { ... @@ -571,7 +571,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie { ... [SPECIES_MEWTHREE] = - { + { ... .pokemonScale = 256, .pokemonOffset = 0, @@ -651,7 +651,7 @@ We're almost there just a bit left! { ... [SPECIES_MEWTHREE] = - { + { ... .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PURPLE, @@ -746,7 +746,7 @@ Again, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... PALETTES(Mewthree), ICON(Mewthree, 2), @@ -847,7 +847,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... FOOTPRINT(Mewthree) .levelUpLearnset = sMewthreeLevelUpLearnset, @@ -870,7 +870,7 @@ Edit `gSpeciesInfo`: { ... [SPECIES_MEWTWO] = - { + { ... FOOTPRINT(Mewtwo) .isLegendary = TRUE, diff --git a/docs/how_to_new_pokemon_1_9_0.md b/docs/how_to_new_pokemon_1_9_0.md index 84742c3a76..e64f8e6e66 100644 --- a/docs/how_to_new_pokemon_1_9_0.md +++ b/docs/how_to_new_pokemon_1_9_0.md @@ -176,7 +176,7 @@ Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald }, + [SPECIES_MEWTHREE] = -+ { ++ { + .baseHP = 106, + .baseAttack = 150, + .baseDefense = 70, @@ -240,7 +240,7 @@ That's all the basic fields present in vanilla emerald, so now let's take a look { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -315,7 +315,7 @@ Lastly, we add the cry to our species entry { ... [SPECIES_MEWTHREE] = - { + { ... .isLegendary = TRUE, .allPerfectIVs = TRUE, @@ -394,7 +394,7 @@ Now we can add the number and entry to our Mewthree: { ... [SPECIES_MEWTHREE] = - { + { ... .cryId = CRY_MEWTHREE, + .natDexNum = NATIONAL_DEX_MEWTHREE, @@ -415,7 +415,7 @@ Now we can add the number and entry to our Mewthree: ``` ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) -The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. `height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). @@ -449,7 +449,7 @@ Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemera NATIONAL_DEX_DUGTRIO, ... }; - + const u16 gPokedexOrder_Height[] = { ... @@ -566,7 +566,7 @@ Now that we have all the external data ready, we just need to add it to `gSpecie { ... [SPECIES_MEWTHREE] = - { + { ... .pokemonScale = 256, .pokemonOffset = 0, @@ -646,7 +646,7 @@ We're almost there just a bit left! { ... [SPECIES_MEWTHREE] = - { + { ... .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PURPLE, @@ -745,7 +745,7 @@ Again, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... PALETTES(Mewthree), ICON(Mewthree, 2), @@ -846,7 +846,7 @@ Once more, we need to register the learnset in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... FOOTPRINT(Mewthree) .levelUpLearnset = sMewthreeLevelUpLearnset, @@ -869,7 +869,7 @@ Edit `gSpeciesInfo`: { ... [SPECIES_MEWTWO] = - { + { ... FOOTPRINT(Mewtwo) .isLegendary = TRUE, @@ -1097,7 +1097,7 @@ And finally, in `gSpeciesInfo`: { ... [SPECIES_MEWTHREE] = - { + { ... FOOTPRINT(Mewthree) + OVERWORLD( diff --git a/docs/how_to_testing_system.md b/docs/how_to_testing_system.md index 793465114c..1f25f9847e 100644 --- a/docs/how_to_testing_system.md +++ b/docs/how_to_testing_system.md @@ -1,11 +1,11 @@ # How to use the Testing System ## Running Tests -To run all the tests use: -`make check -j` -To run specific tests, e.g. Spikes ones, use: -`make check TESTS='Spikes'` -To build a ROM (pokemerald-test.elf) that can be opened in mgba to view specific tests, e.g. Spikes ones, use: +To run all the tests use: +`make check -j` +To run specific tests, e.g. Spikes ones, use: +`make check TESTS='Spikes'` +To build a ROM (pokemerald-test.elf) that can be opened in mgba to view specific tests, e.g. Spikes ones, use: `make pokeemerald-test.elf TESTS='Spikes'` ## How to Write Tests @@ -48,21 +48,21 @@ SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis") STATUS_ICON(opponent, paralysis: TRUE); // 4. } } -``` +``` -The `ASSUMPTIONS` block documents that Stun Spore has `EFFECT_PARALYZE`. -If Stun Spore did not have that effect it would cause the tests in the file to be skipped. We write our tests like this so that hackers can change the effects of moves without causing tests to fail. +The `ASSUMPTIONS` block documents that Stun Spore has `EFFECT_PARALYZE`. +If Stun Spore did not have that effect it would cause the tests in the file to be skipped. We write our tests like this so that hackers can change the effects of moves without causing tests to fail. -`SINGLE_BATTLE_TEST` defines the name of the test. Related tests should start with the same prefix, e.g. Stun Spore tests should start with "Stun Spore", this allows just the Stun Spore-related tests to be run with: -`make check TESTS='Stun Spore'` +`SINGLE_BATTLE_TEST` defines the name of the test. Related tests should start with the same prefix, e.g. Stun Spore tests should start with "Stun Spore", this allows just the Stun Spore-related tests to be run with: +`make check TESTS='Stun Spore'` -`GIVEN` initializes the parties, `PLAYER` and `OPPONENT` add a Pokémon to their respective parties. They can both accept a block which further customizes the Pokémon's stats, moves, item, ability, etc. +`GIVEN` initializes the parties, `PLAYER` and `OPPONENT` add a Pokémon to their respective parties. They can both accept a block which further customizes the Pokémon's stats, moves, item, ability, etc. -`WHEN` describes the turns, and `TURN` describes the choices made in a single turn. `MOVE` causes the player to use Stun Spore and adds the move to the Pokémon's moveset if an explicit Moves was not specified. -Pokémon that are not mentioned in a `TURN` use Celebrate. -The test runner rigs the RNG so that unless otherwise specified, moves always hit, never critical hit, always activate their secondary effects, and always roll the same damage modifier. +`WHEN` describes the turns, and `TURN` describes the choices made in a single turn. `MOVE` causes the player to use Stun Spore and adds the move to the Pokémon's moveset if an explicit Moves was not specified. +Pokémon that are not mentioned in a `TURN` use Celebrate. +The test runner rigs the RNG so that unless otherwise specified, moves always hit, never critical hit, always activate their secondary effects, and always roll the same damage modifier. -`SCENE` describes the player-visible output of the battle. In this case `ANIMATION` checks that the Stun Spore animation played, `MESSAGE` checks the paralysis message was shown, and `STATUS_ICON` checks that the opponent's HP bar shows a PRZ icon. +`SCENE` describes the player-visible output of the battle. In this case `ANIMATION` checks that the Stun Spore animation played, `MESSAGE` checks the paralysis message was shown, and `STATUS_ICON` checks that the opponent's HP bar shows a PRZ icon. ### Example 2 As a second example, to manually test that Stun Spore does not effect Grass-types you might: @@ -90,8 +90,8 @@ SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") } } ``` -The `ASSUME` commands are documenting the reasons why Stun Spore does not affect Oddish, namely that Stun Spore is a powder move, and Oddish is a Grass-type. These `ASSUME` statements function similarly to the ones in `ASSUMPTIONS` but apply only to the one test. -NOT inverts the meaning of a `SCENE` check, so applying it to `ANIMATION` requires that the Stun Spore animation does not play. `MESSAGE` checks that the message was shown. +The `ASSUME` commands are documenting the reasons why Stun Spore does not affect Oddish, namely that Stun Spore is a powder move, and Oddish is a Grass-type. These `ASSUME` statements function similarly to the ones in `ASSUMPTIONS` but apply only to the one test. +NOT inverts the meaning of a `SCENE` check, so applying it to `ANIMATION` requires that the Stun Spore animation does not play. `MESSAGE` checks that the message was shown. The checks in `SCENE` are ordered, so together this says "The doesn't affect message is shown, and the Stun Spore animation does not play at any time before that". Normally you would only test one or the other, or even better, just `NOT STATUS_ICON(opponent, paralysis: TRUE);` to say that Oddish was not paralyzed without specifying the exact outputs which led to that. ### Example 3 @@ -131,9 +131,9 @@ SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage) } ``` -`PARAMETRIZE` causes a test to run multiple times, once per `PARAMETRIZE` block (e.g. once with `raiseAttack = FALSE` and once with `raiseAttack = TRUE`). -The `HP_BAR` command's `captureDamage` causes the change in HP to be stored in a variable, and the variable chosen is `results[i].damage`. -`results[i]` contains all the variables defined at the end of `SINGLE_BATTLE_TEST`, `i` is the current `PARAMETRIZE` index. +`PARAMETRIZE` causes a test to run multiple times, once per `PARAMETRIZE` block (e.g. once with `raiseAttack = FALSE` and once with `raiseAttack = TRUE`). +The `HP_BAR` command's `captureDamage` causes the change in HP to be stored in a variable, and the variable chosen is `results[i].damage`. +`results[i]` contains all the variables defined at the end of `SINGLE_BATTLE_TEST`, `i` is the current `PARAMETRIZE` index. `FINALLY` runs after the last parameter has finished, and uses `EXPECT_MUL_EQ` to check that the second battle deals 1.5× the damage of the first battle (with a small tolerance to account for rounding). You might notice that all the tests check the outputs the player could see rather than the internal battle state. e.g. the Meditate test could have used `gBattleMons[B_POSITION_OPPONENT_LEFT].hp` instead of using `HP_BAR` to capture the damage. This is a deliberate choice, by checking what the player can observe the tests are more robust to refactoring, e.g. if `gBattleMons` got moved into `gBattleStruct` then any test that used it would need to be updated. @@ -144,8 +144,8 @@ The overworld is not available, so it is only possible to test commands which do ## REFERENCE ### `ASSUME` -`ASSUME(cond)` -Causes the test to be skipped if `cond` is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use: +`ASSUME(cond)` +Causes the test to be skipped if `cond` is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use: `ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);` ### `ASSUMPTIONS` @@ -164,16 +164,16 @@ ASSUMPTIONS ``` ### `SINGLE_BATTLE_TEST` -`SINGLE_BATTLE_TEST(name, results...)` and `DOUBLE_BATTLE_TEST(name, results...)` -Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. +`SINGLE_BATTLE_TEST(name, results...)` and `DOUBLE_BATTLE_TEST(name, results...)` +Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. The main differences for doubles are: - Move targets sometimes need to be explicit. - Instead of `player` and `opponent` there is `playerLeft`, `playerRight`, `opponentLeft`, and `opponentRight`. ### `AI_SINGLE_BATTLE_TEST` -`AI_SINGLE_BATTLE_TEST(name, results...)` and `AI_DOUBLE_BATTLE_TEST(name, results...)` +`AI_SINGLE_BATTLE_TEST(name, results...)` and `AI_DOUBLE_BATTLE_TEST(name, results...)` Define battles where opponent mons are controlled by AI, the same that runs -when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command. +when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command. The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with some differences: - opponent's action is specified by the `EXPECT_MOVE` / `EXPECT_SEND_OUT` / `EXPECT_SWITCH` commands - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do @@ -182,7 +182,7 @@ The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with so ### `KNOWN_FAILING` `KNOWN_FAILING;` -Marks a test as not passing due to a bug. If there is an issue number associated with the bug it should be included in a comment. If the test passes the developer will be notified to remove `KNOWN_FAILING`. +Marks a test as not passing due to a bug. If there is an issue number associated with the bug it should be included in a comment. If the test passes the developer will be notified to remove `KNOWN_FAILING`. For example: ``` SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target") @@ -192,7 +192,7 @@ SINGLE_BATTLE_TEST("Jump Kick has no recoil if no target") } ``` ### `PARAMETRIZE` -`PARAMETERIZE { parameter; }` +`PARAMETERIZE { parameter; }` Runs a test multiple times. `i` will be set to which parameter is running, and `results` will contain an entry for each parameter, e.g.: ``` SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage) @@ -246,7 +246,7 @@ Contains the initial state of the parties before the battle. ## `RNGSeed` `RNGSeed(seed)` -Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool. +Explicitly sets the RNG seed. Try to avoid using this because it is a very fragile tool. Example: ``` GIVEN { @@ -256,10 +256,10 @@ GIVEN { ``` ### `FLAG_SET` -`FLAG_SET(flagId)` -Sets the specified flag. Can currently only set one flag at a time. -Cleared between parameters and at the end of the test. -Example: +`FLAG_SET(flagId)` +Sets the specified flag. Can currently only set one flag at a time. +Cleared between parameters and at the end of the test. +Example: ``` GIVEN { FLAG_SET(FLAG_SYS_EXAMPLE_FLAG); @@ -268,8 +268,8 @@ GIVEN { ``` ### `PLAYER` and `OPPONENT` -`PLAYER(species)` and `OPPONENT(species` -Adds the species to the player's or opponent's party respectively. +`PLAYER(species)` and `OPPONENT(species` +Adds the species to the player's or opponent's party respectively. The Pokémon can be further customized with the following functions: - `Gender(MON_MALE | MON_FEMALE)` - `Nature(nature)` @@ -280,14 +280,14 @@ The Pokémon can be further customized with the following functions: - `Moves(moves...)` - `Friendship(friendship)` - `Status1(status1)` -For example to create a level 42 Wobbuffet that is poisoned: -`PLAYER(SPECIES_WOBBUFFET) { Level(42); Status1(STATUS1_POISON); }` -**Note if Speed is specified for any Pokémon then it must be specified for all Pokémon.** +For example to create a level 42 Wobbuffet that is poisoned: +`PLAYER(SPECIES_WOBBUFFET) { Level(42); Status1(STATUS1_POISON); }` +**Note if Speed is specified for any Pokémon then it must be specified for all Pokémon.** **Note if Moves is specified then MOVE will not automatically add moves to the moveset.** ### `AI_FLAGS` -`AI_FLAGS(flags)` -Specifies which AI flags are run during the test. Has use only for AI tests. +`AI_FLAGS(flags)` +Specifies which AI flags are run during the test. Has use only for AI tests. The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` which is the general 'smart' AI. ### `WHEN` @@ -300,8 +300,8 @@ The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_ Contains the choices that battlers make during the battle. ### `TURN` -`TURN { ... }` -Groups the choices made by the battlers on a single turn. If Speeds have not been explicitly specified then the order of the `MOVE` commands in the `TURN` will be used to infer the Speeds of the Pokémon, e.g.: +`TURN { ... }` +Groups the choices made by the battlers on a single turn. If Speeds have not been explicitly specified then the order of the `MOVE` commands in the `TURN` will be used to infer the Speeds of the Pokémon, e.g.: ``` // player's speed will be greater than opponent's speed. TURN { MOVE(player, MOVE_SPLASH); MOVE(opponent, MOVE_SPLASH); } @@ -311,7 +311,7 @@ Groups the choices made by the battlers on a single turn. If Speeds have not bee The inference process is naive, if your test contains anything that modifies the speed of a battler you should specify them explicitly. ### `MOVE` -`MOVE(battler, move | moveSlot:, [megaEvolve:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value])` +`MOVE(battler, move | moveSlot:, [megaEvolve:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value])` Used when the battler chooses Fight. Either the move ID (e.g. `MOVE_TACKLE` or move slot must be specified. - `megaEvolve: TRUE` causes the battler to Mega Evolve if able - `hit: FALSE` causes the move to miss @@ -325,35 +325,35 @@ Used when the battler chooses Fight. Either the move ID (e.g. `MOVE_TACKLE` or m If the battler does not have an explicit Moves specified the moveset will be populated based on the `MOVE`s it uses. ### `FORCED_MOVE` -`FORCED_MOVE(battler)` +`FORCED_MOVE(battler)` Used when the battler chooses Fight and then their move is chosen for them, e.g. when affected by Encore. ``` FORCED_MOVE(player); ``` ### `SWITCH` -`SWITCH(battler, partyIndex)` +`SWITCH(battler, partyIndex)` Used when the battler chooses Switch. ``` SWITCH(player, 1); ``` ### `SKIP_TURN` -`SKIP_TURN(battler)` +`SKIP_TURN(battler)` Used when the battler cannot choose an action, e.g. when locked into Thrash. ``` SKIP_TURN(player); ``` ### `SEND_OUT` -`SEND_OUT(battler, partyIndex)` +`SEND_OUT(battler, partyIndex)` Used when the battler chooses to switch to another Pokémon but not via Switch, e.g. after fainting or due to a U-turn. ``` SEND_OUT(player, 1); ``` ### `USE_ITEM` -`USE_ITEM(battler, itemId, [partyIndex:], [move:])` +`USE_ITEM(battler, itemId, [partyIndex:], [move:])` Used when the battler chooses to use an item from the Bag. The item ID (e.g. ITEM_POTION) must be specified, and party index and move slot if applicable, e.g: ``` USE_ITEM(player, ITEM_X_ATTACK); @@ -378,15 +378,15 @@ Contains an abridged description of the UI during the `THEN`. The order of the d ``` ### `ABILITY_POPUP` -`ABILITY_POPUP(battler, [ability])` -Causes the test to fail if the battler's ability pop-up is not shown. +`ABILITY_POPUP(battler, [ability])` +Causes the test to fail if the battler's ability pop-up is not shown. If specified, ability is the ability shown in the pop-up. ``` ABILITY_POPUP(opponent, ABILITY_MOLD_BREAKER); ``` ### `ANIMATION` -`ANIMATION(type, animId, [battler], [target:])` +`ANIMATION(type, animId, [battler], [target:])` Causes the test to fail if the animation does not play. A common use of this command is to check if a move was successful, e.g.: ``` ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); @@ -394,7 +394,7 @@ Causes the test to fail if the animation does not play. A common use of this com `target` can only be specified for `ANIM_TYPE_MOVE`. ### `EXPERIENCE_BAR` -`EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])` +`EXPERIENCE_BAR(battler, [exp: | captureGainedExp:])` If `exp:` is used, causes the test to fail if that amount of experience is not gained, e.g.: ``` EXPERIENCE_BAR(player, exp: 0); @@ -404,11 +404,11 @@ If `captureGainedExp:` is used, causes the test to fail if the Experience bar do u32 exp; EXPERIENCE_BAR(player, captureGainedExp: &exp); ``` -If none of the above are used, causes the test to fail if the Exp does not change at all. +If none of the above are used, causes the test to fail if the Exp does not change at all. **Please note that due to nature of tests, this command is only usable in `WILD_BATTLE_TEST` and will fail elsewhere.** ### `HP_BAR` -`HP_BAR(battler, [damage: | hp: | captureDamage: | captureHP:])` +`HP_BAR(battler, [damage: | hp: | captureDamage: | captureHP:])` If `hp:` or `damage:` are used, causes the test to fail if that amount of damage is not dealt, e.g.: ``` HP_BAR(player, hp: 0); @@ -422,9 +422,9 @@ If `captureDamage:` or `captureHP:` are used, causes the test to fail if the HP If none of the above are used, causes the test to fail if the HP does not change at all. ### MESSAGE -`MESSAGE(pattern)` -Causes the test to fail if the message in pattern is not displayed. -Spaces in pattern match newlines (\n, \l, and \p) in the message. +`MESSAGE(pattern)` +Causes the test to fail if the message in pattern is not displayed. +Spaces in pattern match newlines (\n, \l, and \p) in the message. Often used to check that a battler took its turn but it failed, e.g.: ``` MESSAGE("Wobbuffet used Dream Eater!"); @@ -432,7 +432,7 @@ Often used to check that a battler took its turn but it failed, e.g.: ``` ### `STATUS_ICON` -`STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)` +`STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:)` Causes the test to fail if the battler's status is not changed to the specified status. ``` STATUS_ICON(player, badPoison: TRUE); @@ -447,7 +447,7 @@ If the expected status icon is parametrized the corresponding `STATUS1` constant ``` ### `NOT` -`NOT sceneCommand` +`NOT sceneCommand` Causes the test to fail if the `SCENE` command succeeds before the following command succeeds. ``` // Our Wobbuffet does not Celebrate before the foe's. @@ -519,27 +519,27 @@ Contains code to run after the battle has finished. If the test is using `PARAME Contains checks to run after all `PARAMETERIZE` commands have run. Prefer to write your checks in `THEN` where possible, because a failure in `THEN` will be tagged with which parameter it corresponds to. ### `EXPECT` -`EXPECT(cond)` +`EXPECT(cond)` Causes the test to fail if `cond` is false. ### `EXPECT_XX` -`EXPECT_EQ(a, b)` -`a == b` +`EXPECT_EQ(a, b)` +`a == b` -`EXPECT_NE(a, b)` -`a != b` +`EXPECT_NE(a, b)` +`a != b` -`EXPECT_LT(a, b)` -`a < b` +`EXPECT_LT(a, b)` +`a < b` -`EXPECT_LE(a, b)` -`a <= b` +`EXPECT_LE(a, b)` +`a <= b` -`EXPECT_GT(a, b)` -`a > b` +`EXPECT_GT(a, b)` +`a > b` -`EXPECT_GE(a, b)` -`a >= b` +`EXPECT_GE(a, b)` +`a >= b` Causes the test to fail if a and b compare incorrectly, e.g. ``` @@ -547,7 +547,7 @@ Causes the test to fail if a and b compare incorrectly, e.g. ``` ### `EXPECT_MUL_EQ` -`EXPECT_MUL_EQ(a, m, b)` +`EXPECT_MUL_EQ(a, m, b)` Causes the test to fail if `a*m != b` (within a threshold), e.g. ``` // Expect results[0].damage * 1.5 == results[1].damage. @@ -557,7 +557,7 @@ Causes the test to fail if a and b compare incorrectly, e.g. ## Overworld Command Reference ### `OVERWORLD_SCRIPT` -`OVERWORLD_SCRIPT(instructions...)` +`OVERWORLD_SCRIPT(instructions...)` Returns a pointer to a compiled overworld script. Cannot be used to initialize global `const` data, although the pointer **IS** to `const` data. Note that each script command must be followed by a ;, e.g.: ``` @@ -568,7 +568,7 @@ const u8 *myScript = OVERWORLD_SCRIPT( ``` ### `RUN_OVERWORLD_SCRIPT` -`RUN_OVERWORLD_SCRIPT(instructions...)` +`RUN_OVERWORLD_SCRIPT(instructions...)` Runs an overworld script in the immediate script context, which means that commands like `waitstate` are not supported. ``` RUN_OVERWORLD_SCRIPT( diff --git a/docs/how_to_trainer_class.md b/docs/how_to_trainer_class.md index a47cbe19c5..3ce0217c28 100644 --- a/docs/how_to_trainer_class.md +++ b/docs/how_to_trainer_class.md @@ -12,13 +12,13 @@ * [Usage](#usage) ## Quick Summary -(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).) +(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).) If you've done this before and just need a quick lookup, here's what files you need: 1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) 2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) 3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h) 4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) -5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) +5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) 6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) 7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) diff --git a/include/test/battle.h b/include/test/battle.h index a44e813f82..865afe8e0b 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -328,7 +328,7 @@ * * MOVE(battler, move | moveSlot:, [gimmick:], [hit:], [criticalHit:], [target:], [allowed:], [WITH_RNG(tag, value]) * Used when the battler chooses Fight. Either the move ID or move slot - * must be specified. gimmick: GIMMICK_MEGA causes the battler to Mega + * must be specified. gimmick: GIMMICK_MEGA causes the battler to Mega * Evolve if able, hit: FALSE causes the move to miss, criticalHit: TRUE * causes the move to land a critical hit, target: is used in double * battles to choose the target (when necessary), and allowed: FALSE is diff --git a/migration_scripts/1.8/item_ball_refactor.py b/migration_scripts/1.8/item_ball_refactor.py index f121978ec8..83d6f9f167 100755 --- a/migration_scripts/1.8/item_ball_refactor.py +++ b/migration_scripts/1.8/item_ball_refactor.py @@ -81,5 +81,5 @@ for file in pories_to_check: raw = re.sub("script %s[ \n]*\{[ \n]*finditem\((.*)\)[ \n]*\}[ \n]*" % unused, "", raw) with open(file, "w") as f2: f2.write(raw) - + print("Done!") diff --git a/migration_scripts/1.9/battle_anim_moves_refactor.py b/migration_scripts/1.9/battle_anim_moves_refactor.py index 116d3964c0..a7adac98ff 100644 --- a/migration_scripts/1.9/battle_anim_moves_refactor.py +++ b/migration_scripts/1.9/battle_anim_moves_refactor.py @@ -37,7 +37,7 @@ for line in lines: comment_split = line.split('//') if move and IsCommaMissing(comment_split[0]): line = comment_split[0].removesuffix('\n') + ',' + line[len(comment_split[0]):-1] + '\n' - + moves_info_lines.append(line) diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 03e6b8a3b1..c10c9081f4 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -731,7 +731,7 @@ $(FLDEFFGFXDIR)/secret_power_tree.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/record_mix_lights.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 1 - + $(POKEMONGFXDIR)/question_mark/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 diff --git a/src/battle_anim.c b/src/battle_anim.c index 71813ddf46..df597560ec 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -798,7 +798,7 @@ static void Cmd_end(void) // Debugging - ensure no hanging mon bg tasks if (FuncIsActiveTask(Task_UpdateMonBg)) DebugPrintf("Move %d animation still has Task_UpdateMonBg active at the end!", gAnimMoveIndex); - + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); if (!IsContest()) { diff --git a/src/battle_anim_dragon.c b/src/battle_anim_dragon.c index 4191c42585..862c0ad069 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -42,35 +42,35 @@ const struct SpriteTemplate gOutrageFlameSpriteTemplate = .callback = AnimOutrageFlame, }; -static const union AnimCmd sAnim_DreepyMissileOpponent_0[] = +static const union AnimCmd sAnim_DreepyMissileOpponent_0[] = { ANIMCMD_FRAME(0, 0, .hFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd *const gAnims_DreepyMissileOpponent[] = +const union AnimCmd *const gAnims_DreepyMissileOpponent[] = { sAnim_DreepyMissileOpponent_0, }; -static const union AnimCmd sAnim_DreepyMissilePlayer_0[] = +static const union AnimCmd sAnim_DreepyMissilePlayer_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; -const union AnimCmd *const gAnims_DreepyMissilePlayer[] = +const union AnimCmd *const gAnims_DreepyMissilePlayer[] = { sAnim_DreepyMissilePlayer_0, }; -static const union AnimCmd sAnim_DreepyMissileNotDrag_0[] = +static const union AnimCmd sAnim_DreepyMissileNotDrag_0[] = { ANIMCMD_FRAME(0, 0, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd *const gAnims_DreepyMissileOpponentNotDrag[] = +const union AnimCmd *const gAnims_DreepyMissileOpponentNotDrag[] = { sAnim_DreepyMissileNotDrag_0, }; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index d8283fc7dc..b29d9b2b94 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6578,11 +6578,11 @@ void PrepareDoubleTeamAnim(u32 taskId, u32 animBattler, bool32 forAllySwitch) gSprites[spriteId].sBattlerFlank = (animBattler != ANIM_ATTACKER); else gSprites[spriteId].sBattlerFlank = (animBattler == ANIM_ATTACKER); - + // correct direction on opponent side if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) gSprites[spriteId].sBattlerFlank ^= 1; - + gSprites[spriteId].callback = AnimDoubleTeam; task->tBlendSpritesCount++; } @@ -6614,7 +6614,7 @@ static void ReloadBattlerSprites(u32 battler, struct Pokemon *party) UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); // If battler has an indicator for a gimmick, hide the sprite until the move animation finishes. UpdateIndicatorVisibilityAndType(gHealthboxSpriteIds[battler], TRUE); - + // Try to recreate shadow sprite if (gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId < MAX_SPRITES) { diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index f58aa97ee2..6afe1e9f36 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -33,7 +33,7 @@ static void AnimSkyAttackBird_Step(struct Sprite *); static void AnimTask_AnimateGustTornadoPalette_Step(u8); static void AnimTask_LoadWindstormBackground_Step(u8 taskId); -const struct SpriteTemplate gEllipticalGustCenteredSpriteTemplate = +const struct SpriteTemplate gEllipticalGustCenteredSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_GUST, diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index 6333cc8183..759c410946 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -414,7 +414,7 @@ u32 UnpackSelectedBattlePalettes(s16 selector) bool8 anim1 = (selector >> 5) & 1; bool8 anim2 = (selector >> 6) & 1; u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gAnimMoveIndex); - + switch (moveTarget) { case MOVE_TARGET_BOTH: @@ -431,7 +431,7 @@ u32 UnpackSelectedBattlePalettes(s16 selector) } break; } - + return GetBattlePalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, anim1, anim2); } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index fae42939d0..d6b2fbdc3a 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -610,7 +610,7 @@ static void InitLinkBtlControllers(void) bool32 IsValidForBattle(struct Pokemon *mon) { u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); - return (species != SPECIES_NONE + return (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(mon, MON_DATA_HP) != 0 && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); diff --git a/src/battle_dome.c b/src/battle_dome.c index 67b9a1e293..06acf6e2f2 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2136,7 +2136,7 @@ static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, i { int evs[NUM_STATS]; int i; - + for (i = 0; i < NUM_STATS; i++) { if (fmon->ev != NULL) @@ -2144,7 +2144,7 @@ static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, i else evs[i] = 0; } - + if (fmon->species == SPECIES_SHEDINJA) { stats[STAT_HP] = 1; @@ -2199,7 +2199,7 @@ static void CreateDomeOpponentMon(u8 monPartyId, u16 tournamentTrainerId, u8 tou u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Using the wrong ID. As a result, all Pokémon have ivs of 3. #endif u8 level = SetFacilityPtrsGetLevel(); - + CreateFacilityMon(&gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][tournamentMonId]], level, fixedIv, otId, 0, &gEnemyParty[monPartyId]); } @@ -4446,7 +4446,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) else allocatedArray[j] = 0; } - + allocatedArray[NUM_STATS] += allocatedArray[STAT_HP]; for (j = 0; j < NUM_NATURE_STATS; j++) { diff --git a/src/battle_factory.c b/src/battle_factory.c index 7d7ec7b3af..b5645368c2 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -406,7 +406,7 @@ static void SetPlayerAndOpponentParties(void) u8 monLevel; u16 monId; u8 ivs; - + if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_TENT) { gFacilityTrainerMons = gSlateportBattleTentMons; @@ -428,7 +428,7 @@ static void SetPlayerAndOpponentParties(void) { monId = gSaveBlock2Ptr->frontier.rentalMons[i].monId; ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs; - + CreateFacilityMon(&gFacilityTrainerMons[monId], monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, &gPlayerParty[i]); SetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, &gSaveBlock2Ptr->frontier.rentalMons[i].personality); diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 5aa019c29f..f76c6a2fc8 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -1761,7 +1761,7 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId) ivs = GetFactoryMonFixedIV(challengeNum + 1, FALSE); else ivs = GetFactoryMonFixedIV(challengeNum, FALSE); - + CreateFacilityMon(&gFacilityTrainerMons[monId], level, ivs, otId, FLAG_FRONTIER_MON_FACTORY, &sFactorySelectScreen->mons[i + firstMonId].monData); diff --git a/src/battle_setup.c b/src/battle_setup.c index 41f2b9b502..54c4f99b92 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1940,7 +1940,7 @@ void IncrementRematchStepCounter(void) #if FREE_MATCH_CALL == FALSE if (!HasAtLeastFiveBadges()) return; - + if (IsVsSeekerEnabled()) return; diff --git a/src/clock.c b/src/clock.c index 7061f96b7f..54c9422bbe 100644 --- a/src/clock.c +++ b/src/clock.c @@ -84,7 +84,7 @@ static void FormChangeTimeUpdate() { struct Pokemon *mon = &gPlayerParty[i]; u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_TIME_OF_DAY, 0); - + if (targetSpecies != SPECIES_NONE) { SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); diff --git a/src/data/gimmicks.h b/src/data/gimmicks.h index 95a233e3fe..5b06feddef 100644 --- a/src/data/gimmicks.h +++ b/src/data/gimmicks.h @@ -5,7 +5,7 @@ const struct GimmickInfo gGimmicksInfo[GIMMICKS_COUNT] = { [GIMMICK_NONE] = {0}, - [GIMMICK_MEGA] = + [GIMMICK_MEGA] = { .triggerSheet = &sSpriteSheet_MegaTrigger, .triggerPal = &sSpritePalette_MegaTrigger, @@ -15,7 +15,7 @@ const struct GimmickInfo gGimmicksInfo[GIMMICKS_COUNT] = .CanActivate = CanMegaEvolve, .ActivateGimmick = ActivateMegaEvolution, }, - [GIMMICK_Z_MOVE] = + [GIMMICK_Z_MOVE] = { .triggerSheet = &sSpriteSheet_ZMoveTrigger, .triggerPal = &sSpritePalette_ZMoveTrigger, @@ -23,7 +23,7 @@ const struct GimmickInfo gGimmicksInfo[GIMMICKS_COUNT] = .CanActivate = CanUseZMove, .ActivateGimmick = ActivateZMove, }, - [GIMMICK_ULTRA_BURST] = + [GIMMICK_ULTRA_BURST] = { .triggerSheet = &sSpriteSheet_BurstTrigger, .triggerPal = &sSpritePalette_BurstTrigger, @@ -31,7 +31,7 @@ const struct GimmickInfo gGimmicksInfo[GIMMICKS_COUNT] = .CanActivate = CanUltraBurst, .ActivateGimmick = ActivateUltraBurst, }, - [GIMMICK_DYNAMAX] = + [GIMMICK_DYNAMAX] = { .triggerSheet = &sSpriteSheet_DynamaxTrigger, .triggerPal = &sSpritePalette_DynamaxTrigger, diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 7f487a5ae5..60dc6997db 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -239,7 +239,7 @@ extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh; // Begin pokemon event objects extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokeBall; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower; - + extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bard; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hipster; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Trader; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 5a6eb28fc3..1edc986c9b 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1493,7 +1493,7 @@ static s16 ReallocSpriteTiles(struct Sprite *sprite, u32 byteSize) { i = -1; } - + sprite->invisible = wasVisible; return i; } @@ -1510,7 +1510,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, bool32 oldInvisible; if (tag == TAG_NONE) tag = COMP_OW_TILE_TAG_BASE + uuid; - + if (sprite) { oldInvisible = sprite->invisible; @@ -1547,7 +1547,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, { FieldEffectFreeTilesIfUnused(oldTiles); } - + if (sprite) { sprite->sheetTileStart = tileStart; @@ -1566,7 +1566,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, { sprite->oam.tileNum = sprite->sheetTileStart; sprite->usingSheet = FALSE; - + } else if (sprite && !sprite->sheetTileStart && sprite->oam.size != info->oam->size) { @@ -1925,7 +1925,7 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) spritePalette.data = gSpeciesInfo[species].overworldShinyPalette; else spritePalette.data = gSpeciesInfo[species].overworldPalette; - + // Check if pal data must be decompressed if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) { diff --git a/src/field_specials.c b/src/field_specials.c index d1b27e2df6..e00aa03803 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -977,8 +977,8 @@ static bool32 IsBuildingPCTile(u32 tileId) static bool32 IsPlayerHousePCTile(u32 tileId) { - return gMapHeader.mapLayout->secondaryTileset == &gTileset_BrendansMaysHouse - && (tileId == METATILE_BrendansMaysHouse_BrendanPC_On + return gMapHeader.mapLayout->secondaryTileset == &gTileset_BrendansMaysHouse + && (tileId == METATILE_BrendansMaysHouse_BrendanPC_On || tileId == METATILE_BrendansMaysHouse_BrendanPC_Off || tileId == METATILE_BrendansMaysHouse_MayPC_On || tileId == METATILE_BrendansMaysHouse_MayPC_Off); diff --git a/src/load_save.c b/src/load_save.c index ee8a6bd04c..a5f2693538 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -211,7 +211,7 @@ void SaveObjectEvents(void) gSaveBlock1Ptr->objectEvents[i].graphicsId = (graphicsId >> 8) | (graphicsId << 8); gSaveBlock1Ptr->objectEvents[i].spriteId = 127; // magic number // To avoid crash on vanilla, save follower as inactive - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER) + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER) gSaveBlock1Ptr->objectEvents[i].active = FALSE; } } diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 67a0d6373f..5cc1f3cfd5 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -550,7 +550,7 @@ static void ShowMapNamePopUpWindow(void) if (OW_POPUP_GENERATION == GEN_5) { AddTextPrinterParameterized(mapNamePopUpWindowId, FONT_SHORT, mapDisplayHeader, 8, 2, TEXT_SKIP_DRAW, NULL); - + if (OW_POPUP_BW_TIME_MODE != OW_POPUP_BW_TIME_NONE) { RtcCalcLocalTime(); @@ -622,7 +622,7 @@ static void LoadMapNamePopUpWindowBg(void) if (OW_POPUP_GENERATION == GEN_5) { popUpThemeId = sRegionMapSectionId_To_PopUpThemeIdMapping_BW[regionMapSectionId]; - switch (popUpThemeId) + switch (popUpThemeId) { // add additional gen 5-style pop-up themes as cases here case MAPPOPUP_THEME_BW_DEFAULT: diff --git a/src/script_menu.c b/src/script_menu.c index b78f1ef112..706c4ac715 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -487,7 +487,7 @@ static void Task_HandleScrollingMultichoiceInput(u8 taskId) { bool32 done = FALSE; s32 input = ListMenu_ProcessInput(gTasks[taskId].data[0]); - + switch (input) { case LIST_HEADER: diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index e732dc7aa2..3d2c7d640c 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -466,7 +466,7 @@ u32 ScriptGiveMon(u16 species, u8 level, u16 item) #define PARSE_FLAG(n, default_) (flags & (1 << (n))) ? VarGet(ScriptReadHalfword(ctx)) : (default_) -/* Give or create a mon to either player or opponent +/* Give or create a mon to either player or opponent */ void ScrCmd_createmon(struct ScriptContext *ctx) { diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 30dcb74ce0..771c01dc72 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -581,7 +581,7 @@ bool32 IsVsSeekerEnabled(void) { if (I_VS_SEEKER_CHARGING == 0) return FALSE; - + return (CheckBagHasItem(ITEM_VS_SEEKER, 1)); } diff --git a/test/battle/ability/anger_point.c b/test/battle/ability/anger_point.c index 7cb283426a..270d66f28e 100644 --- a/test/battle/ability/anger_point.c +++ b/test/battle/ability/anger_point.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack MESSAGE("Primeape cut its own HP and maximized ATTACK!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FROST_BREATH, opponent); MESSAGE("A critical hit!"); - NONE_OF { + NONE_OF { ABILITY_POPUP(player, ABILITY_ANGER_POINT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Primeape's Anger Point maxed its Attack!"); @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit MESSAGE("Primeape made a SUBSTITUTE!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FROST_BREATH, opponent); MESSAGE("A critical hit!"); - NONE_OF { + NONE_OF { ABILITY_POPUP(player, ABILITY_ANGER_POINT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Primeape's Anger Point maxed its Attack!"); diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index 1379506a72..dc82be67b4 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -127,7 +127,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent s } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPERPOWER, opponent); NONE_OF { - ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(opponent, ability); MESSAGE("Foe Solgaleo's Full Metal Body prevents stat loss!"); MESSAGE("Foe Torkoal's White Smoke prevents stat loss!"); MESSAGE("Foe Metang's Clear Body prevents stat loss!"); @@ -186,7 +186,7 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and else{ ANIMATION(ANIM_TYPE_MOVE, move, player); NONE_OF { - ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(opponent, ability); MESSAGE("Foe Solgaleo's Full Metal Body prevents stat loss!"); MESSAGE("Foe Torkoal's White Smoke prevents stat loss!"); MESSAGE("Foe Metang's Clear Body prevents stat loss!"); diff --git a/test/battle/ability/gulp_missile.c b/test/battle/ability/gulp_missile.c index 2ec9acc61b..7ccf1063b5 100644 --- a/test/battle/ability/gulp_missile.c +++ b/test/battle/ability/gulp_missile.c @@ -116,7 +116,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Cramorant in Gorging paralyzes the target if } SINGLE_BATTLE_TEST("(Gulp Missile) triggers even if the user is fainted by opposing mon") -{ +{ GIVEN { PLAYER(SPECIES_CRAMORANT) { HP(1); MaxHP(250); Ability(ABILITY_GULP_MISSILE); } PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/magic_guard.c b/test/battle/ability/magic_guard.c index 69e8bac9c7..5579652265 100644 --- a/test/battle/ability/magic_guard.c +++ b/test/battle/ability/magic_guard.c @@ -13,5 +13,5 @@ SINGLE_BATTLE_TEST("Magic Guard prevents recoil damage to the user") ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, player); HP_BAR(opponent); NOT HP_BAR(player); - } + } } diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index e6156de5a0..e1ceeb2161 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -13,7 +13,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseSpAttack == 85); ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseAttack == 65); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); - PLAYER(SPECIES_GROVYLE) { Level(20); Moves(MOVE_ENERGY_BALL); } + PLAYER(SPECIES_GROVYLE) { Level(20); Moves(MOVE_ENERGY_BALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_TACKLE, MOVE_MIRROR_COAT); } } WHEN { TURN { MOVE(player, MOVE_ENERGY_BALL) ; EXPECT_MOVE(opponent, aiRiskyFlag ? MOVE_MIRROR_COAT : MOVE_TACKLE); } @@ -32,7 +32,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseAttack == 85); ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseSpAttack == 60); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); - PLAYER(SPECIES_MARSHTOMP) { Level(20); Moves(MOVE_WATERFALL); } + PLAYER(SPECIES_MARSHTOMP) { Level(20); Moves(MOVE_WATERFALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_TACKLE, MOVE_COUNTER); } } WHEN { TURN { MOVE(player, MOVE_WATERFALL) ; EXPECT_MOVE(opponent, aiRiskyFlag ? MOVE_COUNTER : MOVE_TACKLE); } @@ -49,7 +49,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will prioritize Revenge if slower") GIVEN { ASSUME(gMovesInfo[MOVE_REVENGE].effect == EFFECT_REVENGE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); - PLAYER(SPECIES_GROVYLE) { Level(20); Speed(4); Moves(MOVE_ENERGY_BALL); } + PLAYER(SPECIES_GROVYLE) { Level(20); Speed(4); Moves(MOVE_ENERGY_BALL); } OPPONENT(SPECIES_CASTFORM) { Level(19); Speed(3); Moves(MOVE_TACKLE, MOVE_REVENGE); } } WHEN { TURN { MOVE(player, MOVE_ENERGY_BALL) ; EXPECT_MOVE(opponent, aiRiskyFlag ? MOVE_REVENGE : MOVE_TACKLE); } @@ -83,7 +83,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI prefers high damage moves at the expens GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); - PLAYER(SPECIES_PSYDUCK) { Level(5); Moves(MOVE_TACKLE); } + PLAYER(SPECIES_PSYDUCK) { Level(5); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_THUNDER, MOVE_THUNDERBOLT); } } WHEN { TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, aiRiskyFlag ? MOVE_THUNDER : MOVE_THUNDERBOLT); } diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 7a70ba0de0..1b50bc4bcc 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -646,7 +646,7 @@ SINGLE_BATTLE_TEST("(TERA) Protean cannot change the type of a Terastallized Pok PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_BUBBLE, gimmick: GIMMICK_TERA); + TURN { MOVE(player, MOVE_BUBBLE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); } } SCENE { MESSAGE("Greninja used Bubble!"); diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 1eb2c7ae74..51c6516106 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); @@ -597,7 +597,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Searing Sunraze Smash ignores the target's abilitie ANIMATION(ANIM_TYPE_MOVE, MOVE_SEARING_SUNRAZE_SMASH, player); HP_BAR(opponent); MESSAGE("A critical hit!"); - } + } } SINGLE_BATTLE_TEST("(Z-MOVE) Z-Revelation Dance always transforms into Breakneck Blitz") diff --git a/test/battle/hold_effect/ability_shield.c b/test/battle/hold_effect/ability_shield.c index ee84b2c5e0..e10c3e0887 100644 --- a/test/battle/hold_effect/ability_shield.c +++ b/test/battle/hold_effect/ability_shield.c @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") } WHEN { TURN { MOVE(opponent, MOVE_SPORE); MOVE(player, MOVE_SPORE); } } SCENE { - + if (item == ITEM_ABILITY_SHIELD) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 8bd6c1f456..743af905ce 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -10,7 +10,7 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Heal Bell cures the entire party") { u32 move; - + PARAMETRIZE { move = MOVE_HEAL_BELL; } PARAMETRIZE { move = MOVE_AROMATHERAPY; } @@ -39,10 +39,10 @@ DOUBLE_BATTLE_TEST("Heal Bell cures the entire party") DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") { u32 ability; - + PARAMETRIZE { ability = ABILITY_SCRAPPY; } PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - + ASSUME(B_HEAL_BELL_SOUNDPROOF != GEN_5); GIVEN { @@ -65,10 +65,10 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") { u32 ability; - + PARAMETRIZE { ability = ABILITY_SCRAPPY; } PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - + ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_5); GIVEN { @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") SINGLE_BATTLE_TEST("Heal Bell cures a soundproof user") -{ +{ ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8); GIVEN { diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index ba6f9b6fe7..50d8aaa773 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -90,7 +90,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); }; } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Recycle cannot recover an item removed by Knock Off") ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF); MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Leftovers!"); - + MESSAGE("Foe Wobbuffet used Recycle!"); MESSAGE("But it failed!"); } THEN { diff --git a/test/battle/move_effect/revelation_dance.c b/test/battle/move_effect/revelation_dance.c index 489dee1c87..9ab5d4a8e2 100644 --- a/test/battle/move_effect/revelation_dance.c +++ b/test/battle/move_effect/revelation_dance.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Revelation Dance changes its type depending on the user's 1s ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); HP_BAR(opponent); MESSAGE("It's not very effective…"); - } + } } } } @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Revelation Dance becomes Normal type if used by a Typeless P NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); HP_BAR(opponent); - MESSAGE("It's not very effective…"); + MESSAGE("It's not very effective…"); } } } diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index 0a42eb90e9..8ecd600f36 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Sleep Talk fails if not asleep") u32 status; PARAMETRIZE { status = STATUS1_SLEEP; } PARAMETRIZE { status = STATUS1_NONE; } - + GIVEN { PLAYER(SPECIES_WOBBUFFET) { Status1(status); Moves(MOVE_SLEEP_TALK, MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH); } OPPONENT(SPECIES_WOBBUFFET); @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Sleep Talk fails if not asleep") SINGLE_BATTLE_TEST("Sleep Talk works if user has Comatose") { - + GIVEN { PLAYER(SPECIES_KOMALA) { Moves(MOVE_SLEEP_TALK, MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/telekinesis.c b/test/battle/move_effect/telekinesis.c index 4210b1865b..3da96a08b9 100644 --- a/test/battle/move_effect/telekinesis.c +++ b/test/battle/move_effect/telekinesis.c @@ -71,4 +71,4 @@ SINGLE_BATTLE_TEST("Telekinesis makes the target immune to Ground-type attacks") TO_DO_BATTLE_TEST("Baton Pass passes Telekinesis' effect"); //Bulbapedia doesn't confirm what happens with Diglett, Dugtrio, Sandygast and Palossand, so it needs to be tested in-game. -TO_DO_BATTLE_TEST("Baton Pass removes Telekinesis' effect disappears if the switching-in mon is Mega Gengar"); +TO_DO_BATTLE_TEST("Baton Pass removes Telekinesis' effect disappears if the switching-in mon is Mega Gengar"); diff --git a/tools/learnset_helpers/teachable.py b/tools/learnset_helpers/teachable.py index 92ed8562d8..eb109e7a46 100644 --- a/tools/learnset_helpers/teachable.py +++ b/tools/learnset_helpers/teachable.py @@ -13,7 +13,7 @@ with open("./include/config/pokemon.h", "r") as file: def parse_mon_name(name): return re.sub(r'(?!^)([A-Z]+)', r'_\1', name).upper() - + tm_moves = [] tutor_moves = [] @@ -196,7 +196,7 @@ for move in tm_moves: header += "// " + longest_move_name * "*" + " //\n" header_print(tutor_title) tutor_moves.sort() # alphabetically sort tutor moves for easier referencing -for move in tutor_moves: +for move in tutor_moves: header_print("- " + move) header += "// " + longest_move_name * "*" + " //\n" header_print(universal_title) diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index ca8b8cc4ae..39d352bbd7 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -673,14 +673,14 @@ int AsmFile::FindLastLineNumber(std::string& filename) if (pos < 0) RaiseError("line indicator for header file not found before `enum`"); - + pos++; while (m_buffer[pos] == ' ' || m_buffer[pos] == '\t') pos++; if (!IsAsciiDigit(m_buffer[pos])) RaiseError("malformatted line indicator found before `enum`, expected line number"); - + unsigned n = 0; int digit = 0; while ((digit = ConvertDigit(m_buffer[pos++], 10)) != -1) @@ -715,7 +715,7 @@ int AsmFile::FindLastLineNumber(std::string& filename) filename += c; } - + return n + linebreaks - 1; } From fe275ef0629cf4560c774bbccba54fd5aeee1f8d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 15 Aug 2024 07:45:01 -0400 Subject: [PATCH 099/225] Teatime animations use B_WAIT_TIME_LONG (#5173) --- data/battle_scripts_1.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c47127c651..47436136ca 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -578,7 +578,7 @@ BattleScript_Teatimerod: statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds - waitmessage 0x40 + waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_TeatimeLoop moveendcase MOVEEND_CLEAR_BITS @@ -590,7 +590,7 @@ BattleScript_Teatimemotor: statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds - waitmessage 0x40 + waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_TeatimeLoop moveendcase MOVEEND_CLEAR_BITS From 45f10d734fde18c96fccdf2bf152c9e3e3aebae8 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 15 Aug 2024 13:51:39 +0200 Subject: [PATCH 100/225] Fixed Ice Face, implemented tests (#5171) * Fixed Ice Face, implemented tests * Fixed agbcc and bad battle mon looping * Fixed the ShouldChangeFormInWeather function again * Cleaned up End of Turn weather form changes, simplified Ice Face --------- Co-authored-by: Hedara --- include/battle.h | 1 - src/battle_main.c | 2 - src/battle_util.c | 45 +++-------- test/battle/ability/ice_face.c | 140 +++++++++++++++++++++++++++++++-- 4 files changed, 146 insertions(+), 42 deletions(-) diff --git a/include/battle.h b/include/battle.h index 1d60aacec1..ace178c0e7 100644 --- a/include/battle.h +++ b/include/battle.h @@ -763,7 +763,6 @@ struct BattleStruct bool8 effectsBeforeUsingMoveDone:1; // Mega Evo and Focus Punch/Shell Trap effects. u8 targetsDone[MAX_BATTLERS_COUNT]; // Each battler as a bit. u16 overwrittenAbilities[MAX_BATTLERS_COUNT]; // abilities overwritten during battle (keep separate from battle history in case of switching) - bool8 allowedToChangeFormInWeather[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side, used by Ice Face. u8 battleBondTransformed[NUM_BATTLE_SIDES]; // Bitfield for each party. u8 storedHealingWish:4; // Each battler as a bit. u8 storedLunarDance:4; // Each battler as a bit. diff --git a/src/battle_main.c b/src/battle_main.c index e164976e9d..55337a045e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3114,8 +3114,6 @@ static void BattleStartClearSetData(void) gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); gBattleStruct->itemLost[B_SIDE_OPPONENT][i].originalItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); gPartyCriticalHits[i] = 0; - gBattleStruct->allowedToChangeFormInWeather[i][B_SIDE_PLAYER] = FALSE; - gBattleStruct->allowedToChangeFormInWeather[i][B_SIDE_OPPONENT] = FALSE; } gBattleStruct->swapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky diff --git a/src/battle_util.c b/src/battle_util.c index ada7cb20a3..c18b0544a0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1671,7 +1671,6 @@ enum ENDTURN_ION_DELUGE, ENDTURN_FAIRY_LOCK, ENDTURN_RETALIATE, - ENDTURN_WEATHER_FORM, ENDTURN_STATUS_HEAL, ENDTURN_RAINBOW, ENDTURN_SEA_OF_FIRE, @@ -2171,18 +2170,6 @@ u8 DoFieldEndTurnEffects(void) gSideTimers[B_SIDE_OPPONENT].retaliateTimer--; gBattleStruct->turnCountersTracker++; break; - case ENDTURN_WEATHER_FORM: - for (i = 0; i < gBattlersCount; i++) - { - if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0)) - { - effect++; - break; - } - } - if (effect == 0) - gBattleStruct->turnCountersTracker++; - break; case ENDTURN_STATUS_HEAL: for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) { @@ -3894,21 +3881,6 @@ static const u16 sWeatherFlagsInfo[][3] = [ENUM_WEATHER_FOG] = {B_WEATHER_FOG_TEMPORARY, B_WEATHER_FOG_PERMANENT, HOLD_EFFECT_NONE}, }; -static void ShouldChangeFormInWeather(u32 battler) -{ - int i; - int side = GetBattlerSide(battler); - struct Pokemon *party = GetSideParty(side); - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_EISCUE_NOICE_FACE) - gBattleStruct->allowedToChangeFormInWeather[i][side] = TRUE; - else - gBattleStruct->allowedToChangeFormInWeather[i][side] = FALSE; - } -} - bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility) { u16 battlerAbility = GetBattlerAbility(battler); @@ -3922,7 +3894,6 @@ bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility) else if (B_ABILITY_WEATHER < GEN_6 && viaAbility && !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1])) { gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); - ShouldChangeFormInWeather(battler); return TRUE; } else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) @@ -3932,7 +3903,6 @@ bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility) gWishFutureKnock.weatherDuration = 8; else gWishFutureKnock.weatherDuration = 5; - ShouldChangeFormInWeather(battler); return TRUE; } return FALSE; @@ -4961,6 +4931,17 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + case ABILITY_ICE_FACE: + if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) + && gBattleMons[battler].species == SPECIES_EISCUE_NOICE_FACE + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + { + // TODO: Convert this to a proper FORM_CHANGE type. + gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; + BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); + effect++; + } + break; } break; case ABILITYEFFECT_ENDTURN: @@ -6285,11 +6266,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_ICE_FACE: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) && gBattleMons[battler].species == SPECIES_EISCUE_NOICE_FACE - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && gBattleStruct->allowedToChangeFormInWeather[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { // TODO: Convert this to a proper FORM_CHANGE type. - gBattleStruct->allowedToChangeFormInWeather[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = FALSE; gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; diff --git a/test/battle/ability/ice_face.c b/test/battle/ability/ice_face.c index 53917b5623..54a307754c 100644 --- a/test/battle/ability/ice_face.c +++ b/test/battle/ability/ice_face.c @@ -1,9 +1,137 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noice Face form"); // Include Special move in test -TO_DO_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face Eiscue is out"); -TO_DO_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while hail or snow is active"); -TO_DO_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face form while there's already hail"); -TO_DO_BATTLE_TEST("Ice Face form change persists after switching out"); -TO_DO_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noice Face form") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_EISCUE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + } +} + +SINGLE_BATTLE_TEST("Ice Face does not block special moves, Eiscue stays in Ice Face form") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_EISCUE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_ICE_FACE); + } +} + +SINGLE_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face Eiscue is out") +{ + u32 move; + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_HAIL; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + PLAYER(SPECIES_EISCUE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + } +} + +SINGLE_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while hail or snow is active") +{ + u32 move; + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_HAIL; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + PLAYER(SPECIES_EISCUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TACKLE); } + TURN { SWITCH(player, 1); MOVE(opponent, move); } + TURN { SWITCH(player, 0); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + } +} + +SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face form while there's already hail or snow") +{ + u32 move; + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_HAIL; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + PLAYER(SPECIES_EISCUE) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + MESSAGE("Eiscue used Celebrate!"); + MESSAGE("Eiscue fainted!"); + } +} + +SINGLE_BATTLE_TEST("Ice Face form change persists after switching out") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_EISCUE) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + TURN { SWITCH(player, 0); MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + MESSAGE("Eiscue fainted!"); + } +} + +SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is on the field") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_EISCUE) { HP(1); } + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_SNOWSCAPE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + MESSAGE("Eiscue fainted!"); + } +} From 47356d181ac954897d92c2edcc1fa72400160a53 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 15 Aug 2024 19:27:35 +0200 Subject: [PATCH 101/225] Fixed followers breaking for species IDs above 1535 (#5179) * Fixed followers breaking for species Ids above 1535 * Added reminder to increase follower species bits if needed in the future --------- Co-authored-by: Hedara --- include/constants/event_objects.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index e2ac7f7920..fccc206638 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -271,7 +271,7 @@ #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) #define OBJ_EVENT_GFX_MON_BASE 0x200 // 512 -#define OBJ_EVENT_GFX_SPECIES_BITS 11 +#define OBJ_EVENT_GFX_SPECIES_BITS 12 // This will need to be updated when NUM_SPECIES is > ~3.5k #define OBJ_EVENT_GFX_SPECIES_MASK ((1 << OBJ_EVENT_GFX_SPECIES_BITS) - 1) // Used to call a specific species' follower graphics. Useful for static encounters. From ec3a86dd9a85c6dd6c85ff0826b576925ef0383e Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:37:23 +0100 Subject: [PATCH 102/225] Adds in-battle effect of Pickup, adds Harvest and Pickup tests (#5170) * Adds Harvest tests * Adds Pickup in-battle effect + tests * Fix G-Max Replenish test (Munchlax activates Pickup before G-Max Replenish) * Change canPickupItem to bit field * Make RandomUniformExcept inclusive (higher end) + convert bitfield * Use CantPickupItem in PickupHasValidTargetc check * Review --- data/battle_scripts_1.s | 9 ++ include/battle.h | 1 + include/battle_scripts.h | 1 + include/battle_util.h | 2 + include/random.h | 2 + src/battle_main.c | 2 + src/battle_script_commands.c | 6 +- src/battle_util.c | 32 +++- test/battle/ability/harvest.c | 274 +++++++++++++++++++++++++++++-- test/battle/ability/pickup.c | 295 ++++++++++++++++++++++++++++++++++ test/battle/gimmick/dynamax.c | 2 +- test/test_runner_battle.c | 2 +- 12 files changed, 610 insertions(+), 18 deletions(-) create mode 100644 test/battle/ability/pickup.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c47127c651..95fffd0513 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7754,6 +7754,15 @@ BattleScript_CheekPouchActivates:: copybyte gBattlerAttacker, sSAVED_BATTLER return +BattleScript_PickupActivates:: + pause 5 + tryrecycleitem BattleScript_PickupActivatesEnd + call BattleScript_AbilityPopUp + printstring STRINGID_XFOUNDONEY + waitmessage B_WAIT_TIME_LONG +BattleScript_PickupActivatesEnd: + end3 + BattleScript_HarvestActivates:: pause 5 tryrecycleitem BattleScript_HarvestActivatesEnd diff --git a/include/battle.h b/include/battle.h index ace178c0e7..0d54f2a614 100644 --- a/include/battle.h +++ b/include/battle.h @@ -676,6 +676,7 @@ struct BattleStruct u16 chosenItem[MAX_BATTLERS_COUNT]; u16 choicedMove[MAX_BATTLERS_COUNT]; u16 changedItems[MAX_BATTLERS_COUNT]; + u8 canPickupItem; u8 switchInBattlerCounter; u8 arenaTurnCounter; u8 turnSideTracker; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 6bdb88b28f..cd35e1de82 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -295,6 +295,7 @@ extern const u8 BattleScript_WeakArmorActivates[]; extern const u8 BattleScript_FellStingerRaisesStat[]; extern const u8 BattleScript_SnowWarningActivatesHail[]; extern const u8 BattleScript_SnowWarningActivatesSnow[]; +extern const u8 BattleScript_PickupActivates[]; extern const u8 BattleScript_HarvestActivates[]; extern const u8 BattleScript_ImposterActivates[]; extern const u8 BattleScript_SelectingNotAllowedMoveAssaultVest[]; diff --git a/include/battle_util.h b/include/battle_util.h index 8eadf47c98..de05242902 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -231,6 +231,8 @@ bool32 TryRoomService(u32 battler); void BufferStatChange(u32 battler, u8 statId, u8 stringId); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); u16 GetUsedHeldItem(u32 battler); +bool32 PickupHasValidTarget(u32 battler); +bool32 CantPickupItem(u32 battler); bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags); u32 GetBattlerMoveTargetType(u32 battler, u32 move); bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move); diff --git a/include/random.h b/include/random.h index cd7e26b589..d254a08f03 100644 --- a/include/random.h +++ b/include/random.h @@ -173,12 +173,14 @@ enum RandomTag RNG_G_MAX_BEFUDDLE, RNG_G_MAX_REPLENISH, RNG_G_MAX_SNOOZE, + RNG_HARVEST, RNG_HITS, RNG_HOLD_EFFECT_FLINCH, RNG_INFATUATION, RNG_LOADED_DICE, RNG_METRONOME, RNG_PARALYSIS, + RNG_PICKUP, RNG_POISON_POINT, RNG_POISON_TOUCH, RNG_RAMPAGE_TURNS, diff --git a/src/battle_main.c b/src/battle_main.c index 55337a045e..10f27e921f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3219,6 +3219,7 @@ void SwitchInClearSetData(u32 battler) gBattleStruct->lastMoveFailed &= ~(gBitTable[battler]); gBattleStruct->palaceFlags &= ~(gBitTable[battler]); gBattleStruct->boosterEnergyActivates &= ~(gBitTable[battler]); + gBattleStruct->canPickupItem &= ~(1u << battler); for (i = 0; i < ARRAY_COUNT(gSideTimers); i++) { @@ -5112,6 +5113,7 @@ static void TurnValuesCleanUp(bool8 var0) if (gDisableStructs[i].rechargeTimer == 0) gBattleMons[i].status2 &= ~STATUS2_RECHARGE; } + gBattleStruct->canPickupItem &= ~(1u << i); } if (gDisableStructs[i].substituteHP == 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index afc63fed9b..6ba28f5027 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8071,6 +8071,7 @@ static void Cmd_removeitem(void) gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out gBattleMons[battler].item = ITEM_NONE; + gBattleStruct->canPickupItem |= (1u << battler); CheckSetUnburden(battler); BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battler].item), &gBattleMons[battler].item); @@ -14853,7 +14854,10 @@ static void Cmd_tryrecycleitem(void) u16 *usedHeldItem; - usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)]; + if (gCurrentMove == MOVE_NONE && GetBattlerAbility(gBattlerAttacker) == ABILITY_PICKUP) + usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + else + usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)]; if (*usedHeldItem != ITEM_NONE && gBattleMons[gBattlerAttacker].item == ITEM_NONE) { gLastUsedItem = *usedHeldItem; diff --git a/src/battle_util.c b/src/battle_util.c index c18b0544a0..8729d0cf1a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4950,8 +4950,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattlerAttacker = battler; switch (gLastUsedAbility) { + case ABILITY_PICKUP: + if (gBattleMons[battler].item == ITEM_NONE + && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item + && PickupHasValidTarget(battler)) + { + gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem); + gLastUsedItem = GetUsedHeldItem(gBattlerTarget); + BattleScriptPushCursorAndCallback(BattleScript_PickupActivates); + effect++; + } + break; case ABILITY_HARVEST: - if ((IsBattlerWeatherAffected(battler, B_WEATHER_SUN) || Random() % 2 == 0) + if ((IsBattlerWeatherAffected(battler, B_WEATHER_SUN) || RandomPercentage(RNG_HARVEST, 50)) && gBattleMons[battler].item == ITEM_NONE && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item && ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) @@ -11398,6 +11409,25 @@ u16 GetUsedHeldItem(u32 battler) return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; } +bool32 CantPickupItem(u32 battler) +{ + // Used by RandomUniformExcept() for RNG_PICKUP + if (battler == gBattlerAttacker && gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK)) + return TRUE; + return !(IsBattlerAlive(battler) && GetUsedHeldItem(battler) && gBattleStruct->canPickupItem & (1u << battler)); +} + +bool32 PickupHasValidTarget(u32 battler) +{ + u32 i; + for (i = 0; i < gBattlersCount; i++) + { + if (!CantPickupItem(i)) + return TRUE; + } + return FALSE; +} + bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) { if (gBattleWeather & weatherFlags && WEATHER_HAS_EFFECT) diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index b4783c4542..f19e0715de 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -1,18 +1,264 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn"); -TO_DO_BATTLE_TEST("Harvest always restores a Berry in Sunlight"); -TO_DO_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Lock is on the field"); -TO_DO_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in"); -TO_DO_BATTLE_TEST("Harvest restores a Berry consumed by Fling"); -TO_DO_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift"); +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4); + ASSUME(gMovesInfo[MOVE_SUNNY_DAY].effect == EFFECT_SUNNY_DAY); +} + +SINGLE_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn") +{ + PASSES_RANDOMLY(1, 2, RNG_HARVEST); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Harvest always restores a Berry in Sunlight") +{ + PASSES_RANDOMLY(1, 1, RNG_HARVEST); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Lock is on the field") +{ + PASSES_RANDOMLY(1, 2, RNG_HARVEST); + GIVEN { + PLAYER(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in") +{ + ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_PARTING_SHOT); SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_PARTING_SHOT); SEND_OUT(opponent, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling") +{ + ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, opponent); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift") +{ + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_NATURAL_GIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, opponent); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_SITRUS_BERRY); + } +} + TO_DO_BATTLE_TEST("Harvest only works once per turn"); // Check for berries that are consumed immediately, like Pecha Berry -TO_DO_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate"); -TO_DO_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Off"); -TO_DO_BATTLE_TEST("Harvest doesn't restore a Berry when eaten by Bug Bite/Pluck"); -TO_DO_BATTLE_TEST("Harvest doesn't restore a Berry that's collected via Pickup"); -TO_DO_BATTLE_TEST("Harvest order is affected by speed"); -TO_DO_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon"); -TO_DO_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon"); -TO_DO_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry"); + +SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate") +{ + PASSES_RANDOMLY(1, 1, RNG_HARVEST); + ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_INCINERATE); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_INCINERATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Off") +{ + PASSES_RANDOMLY(1, 1, RNG_HARVEST); + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when eaten by Bug Bite/Pluck") +{ + PASSES_RANDOMLY(1, 1, RNG_HARVEST); + ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_BUG_BITE); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BITE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry that's collected via Pickup") +{ + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Speed(50); Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_EXEGGUTOR) { Speed(10); Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(player->item, ITEM_SITRUS_BERRY); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Harvest order is affected by speed") +{ + GIVEN { + PLAYER(SPECIES_EXEGGUTOR) { Speed(2); Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_EXEGGUTOR) { Speed(10); Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(playerRight, MOVE_BULLDOZE); MOVE(playerLeft, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_HARVEST); + ABILITY_POPUP(playerLeft, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponentLeft->item, ITEM_SITRUS_BERRY); + EXPECT_EQ(playerLeft->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon") +{ + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_TRICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_HARVEST); + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon") +{ + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + GIVEN { + PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); } + } WHEN { + TURN { MOVE(opponent, MOVE_TRICK); MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } THEN { + EXPECT_GT(opponent->hp, opponent->maxHP / 2); // eats 2 Sitrus + } +} + +SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry") +{ + ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); + GIVEN { + PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); } + } WHEN { + TURN { MOVE(opponent, MOVE_TRICK); MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ABILITY_POPUP(opponent, ABILITY_HARVEST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } THEN { + EXPECT_GT(opponent->hp, opponent->maxHP / 2); // eats 2 Sitrus + } +} diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c new file mode 100644 index 0000000000..57f6429feb --- /dev/null +++ b/test/battle/ability/pickup.c @@ -0,0 +1,295 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4); +} + +SINGLE_BATTLE_TEST("Pickup grants an item used by another Pokémon") +{ + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } THEN { + EXPECT_EQ(player->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant the user their item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant another Pokémon's popped Air Balloon") +{ + ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Air Balloon!"); + } + } THEN { + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an item not used that turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an item after its holder faints") +{ + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_MEMENTO); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced") +{ + ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_PARTING_SHOT); SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); MOVE(opponent, MOVE_PARTING_SHOT); SEND_OUT(opponent, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PARTING_SHOT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PARTING_SHOT, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with Incinerate") +{ + ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE)); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_INCINERATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_INCINERATE, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item") +{ + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bite/Pluck") +{ + ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_BUG_BITE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BITE, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restored it") +{ + ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_RECYCLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RECYCLE, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged") +{ + ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(opponent, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, opponent); + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } THEN { + EXPECT_EQ(player->item, ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Pickup restores an item that was used by Natural Gift") +{ + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(opponent, MOVE_NATURAL_GIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, opponent); + ABILITY_POPUP(player, ABILITY_PICKUP); + MESSAGE("Zigzagoon found one Sitrus Berry!"); + } THEN { + EXPECT_EQ(player->item, ITEM_SITRUS_BERRY); + } +} + +DOUBLE_BATTLE_TEST("Pickup triggers based on Speed order") +{ + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Speed(1); Ability(ABILITY_PICKUP); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(50); Ability(ABILITY_PICKUP); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft); + ABILITY_POPUP(opponentRight, ABILITY_PICKUP); + NOT ABILITY_POPUP(playerLeft, ABILITY_PICKUP); + } THEN { + EXPECT_EQ(opponentRight->item, ITEM_SITRUS_BERRY); + EXPECT_EQ(playerLeft->item, ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Pickup grants a random item used by another Pokémon") +{ + PASSES_RANDOMLY(1, 3, RNG_PICKUP); + ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_RESTORE_STATS); + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BULLDOZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_PICKUP); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_SITRUS_BERRY); + } +} + +DOUBLE_BATTLE_TEST("Pickup doesn't trigger more than once per turn") +{ + GIVEN { + PLAYER(SPECIES_ZIGZAGOON) { HP(1); Ability(ABILITY_PICKUP); } + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BULLDOZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_PICKUP); + NOT ABILITY_POPUP(playerLeft, ABILITY_PICKUP); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_NONE); + EXPECT_GT(playerLeft->hp, 1); + EXPECT_LT(playerLeft->hp, playerLeft->maxHP/2); + } +} diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index dca175c637..b865ef2f1c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1234,7 +1234,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of t GIVEN { ASSUME(gMovesInfo[MOVE_G_MAX_REPLENISH].argument == MAX_EFFECT_RECYCLE_BERRIES); PLAYER(SPECIES_SNORLAX) { Item(ITEM_APICOT_BERRY); GigantamaxFactor(TRUE); } - PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); } + PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); Ability(ABILITY_THICK_FAT); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } } WHEN { diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 92789710f7..6f318bbead 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -410,7 +410,7 @@ u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32 if (STATE->trials == 1) { u32 n = 0, i; - for (i = lo; i < hi; i++) + for (i = lo; i <= hi; i++) if (!reject(i)) n++; STATE->trials = n; From bd3d99d7d9031ef0e12de2c9d1ab31ecfca503b8 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 16 Aug 2024 17:31:28 +0200 Subject: [PATCH 103/225] Fixed Retaliate not working correctly with passive damage (#5182) * Fixed Retaliate not working correctly when allies fainted from passive end of turn damage * Changed test parameters to use legal stats --------- Co-authored-by: Hedara --- src/battle_main.c | 5 + src/battle_script_commands.c | 2 +- src/battle_util.c | 8 -- test/battle/move_effect/retaliate.c | 137 ++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 test/battle/move_effect/retaliate.c diff --git a/src/battle_main.c b/src/battle_main.c index 10f27e921f..cba22fa5ef 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4038,6 +4038,11 @@ void BattleTurnPassed(void) SetAiLogicDataForTurn(AI_DATA); // get assumed abilities, hold effects, etc of all battlers gBattleMainFunc = HandleTurnActionSelectionState; + if (gSideTimers[B_SIDE_PLAYER].retaliateTimer > 0) + gSideTimers[B_SIDE_PLAYER].retaliateTimer--; + if (gSideTimers[B_SIDE_OPPONENT].retaliateTimer > 0) + gSideTimers[B_SIDE_OPPONENT].retaliateTimer--; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) BattleScriptExecute(BattleScript_PalacePrintFlavorText); else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6ba28f5027..394a455b3a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3502,7 +3502,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { gBattleScripting.savedBattler = BATTLE_PARTNER(gBattlerTarget); - gBattleMoveDamage = gBattleMons[BATTLE_PARTNER(gBattlerTarget)].hp / 16; + gBattleMoveDamage = gBattleMons[BATTLE_PARTNER(gBattlerTarget)].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; diff --git a/src/battle_util.c b/src/battle_util.c index 8729d0cf1a..0a680cc272 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1670,7 +1670,6 @@ enum ENDTURN_PSYCHIC_TERRAIN, ENDTURN_ION_DELUGE, ENDTURN_FAIRY_LOCK, - ENDTURN_RETALIATE, ENDTURN_STATUS_HEAL, ENDTURN_RAINBOW, ENDTURN_SEA_OF_FIRE, @@ -2163,13 +2162,6 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; - case ENDTURN_RETALIATE: - if (gSideTimers[B_SIDE_PLAYER].retaliateTimer > 0) - gSideTimers[B_SIDE_PLAYER].retaliateTimer--; - if (gSideTimers[B_SIDE_OPPONENT].retaliateTimer > 0) - gSideTimers[B_SIDE_OPPONENT].retaliateTimer--; - gBattleStruct->turnCountersTracker++; - break; case ENDTURN_STATUS_HEAL: for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) { diff --git a/test/battle/move_effect/retaliate.c b/test/battle/move_effect/retaliate.c new file mode 100644 index 0000000000..581793e854 --- /dev/null +++ b/test/battle/move_effect/retaliate.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_RETALIATE].effect == EFFECT_RETALIATE); +} + +SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faints") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_RETALIATE); } + TURN { MOVE(player, MOVE_RETALIATE); } + } SCENE { + HP_BAR(opponent, captureDamage: &damage[0]); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + } +} + +SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faints (opponent)") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); SEND_OUT(opponent, 1); } + TURN { MOVE(opponent, MOVE_RETALIATE); } + TURN { MOVE(opponent, MOVE_RETALIATE); } + } SCENE { + HP_BAR(player, captureDamage: &damage[0]); + HP_BAR(player, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + } +} + +DOUBLE_BATTLE_TEST("Retaliate works with passive damage") +{ + s16 damage[2]; + u32 move; + u32 move2 = MOVE_CELEBRATE; + struct BattlePokemon *moveTarget = playerLeft; + PARAMETRIZE { move = MOVE_TOXIC; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_POISON_POWDER; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_WILL_O_WISP; moveTarget = playerLeft; } + #if B_USE_FROSTBITE == TRUE + PARAMETRIZE { move = MOVE_ICE_BEAM; moveTarget = playerLeft; } + #endif + PARAMETRIZE { move = MOVE_SANDSTORM; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_HAIL; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_LEECH_SEED; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_MAGMA_STORM; moveTarget = playerLeft; } + PARAMETRIZE { move = MOVE_FLAME_BURST; moveTarget = playerRight; } + PARAMETRIZE { move = MOVE_FIRE_PLEDGE; moveTarget = playerRight; move2 = MOVE_GRASS_PLEDGE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); + #if B_USE_FROSTBITE == TRUE + ASSUME(gMovesInfo[MOVE_ICE_BEAM].additionalEffects[0].moveEffect == MOVE_EFFECT_FREEZE_OR_FROSTBITE); + #endif + ASSUME(gMovesInfo[MOVE_SANDSTORM].effect == EFFECT_SANDSTORM); + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(gMovesInfo[MOVE_LEECH_SEED].effect == EFFECT_LEECH_SEED); + ASSUME(gMovesInfo[MOVE_MAGMA_STORM].additionalEffects[0].moveEffect == MOVE_EFFECT_WRAP); + ASSUME(gMovesInfo[MOVE_FLAME_BURST].additionalEffects[0].moveEffect == MOVE_EFFECT_FLAME_BURST); + PLAYER(SPECIES_WYNAUT) { Ability(ABILITY_SHADOW_TAG); HP(18); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); Level(1); } + OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); } + } WHEN { + TURN { MOVE(opponentRight, move2, target: moveTarget); MOVE(opponentLeft, move, target: moveTarget); MOVE(playerLeft, MOVE_CELEBRATE); SEND_OUT(playerLeft, 2); } + TURN { MOVE(opponentRight, MOVE_CELEBRATE, target: moveTarget); MOVE(playerLeft, MOVE_RETALIATE, target: opponentRight); } + TURN { MOVE(opponentRight, MOVE_CELEBRATE, target: moveTarget); MOVE(playerLeft, MOVE_RETALIATE, target: opponentRight); } + } SCENE { + if (move != MOVE_FLAME_BURST) + MESSAGE("Wynaut used Celebrate!"); + HP_BAR(opponentRight, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + } +} + +SINGLE_BATTLE_TEST("Retaliate works with Perish Song") +{ + s16 damage[2]; + GIVEN { + ASSUME(gMovesInfo[MOVE_PERISH_SONG].effect == EFFECT_PERISH_SONG); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KOMMO_O) { Ability(ABILITY_SOUNDPROOF); } + } WHEN { + TURN { MOVE(opponent, MOVE_PERISH_SONG); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_RETALIATE); } + TURN { MOVE(player, MOVE_RETALIATE); } + } SCENE { + HP_BAR(opponent, captureDamage: &damage[0]); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + } +} + +SINGLE_BATTLE_TEST("Retaliate works with self-inflicted fainting") +{ + s16 damage[2]; + GIVEN { + ASSUME(gMovesInfo[MOVE_HEALING_WISH].effect == EFFECT_HEALING_WISH); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_RETALIATE); } + TURN { MOVE(player, MOVE_RETALIATE); } + } SCENE { + HP_BAR(opponent, captureDamage: &damage[0]); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + } +} From bced2c97a1d3a9823c5aaf8a0c3729e0f7385601 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:41:26 -0400 Subject: [PATCH 104/225] Created PokeNav COMPOUND_STRINGS (#4983) * Converted Match Call names and descriptions to COMPOUND_STRINGs * Moved May/Brendan and Elite Four descriptions into pokenav_match_call_data.c * Moved Steven, Brendan, and May's Match Call text to pokenav_match_call_data.c * Cleaned up Steven's Match Call text * Added PokeNav option text to match_call_gfx * Moved PokeNav page descriptions to menu_handler_gfx * Moved help bar texts to pokenav_main_menu.c * Moved various PokeNav strings out of strings.c and into their relevant files * Removed unused PokeNav strings --- include/strings.h | 85 ------------------------- src/pokenav_conditions_gfx.c | 2 + src/pokenav_conditions_search_results.c | 2 + src/pokenav_list.c | 4 ++ src/pokenav_main_menu.c | 24 +++---- src/pokenav_match_call_data.c | 67 +++++++++++-------- src/pokenav_match_call_gfx.c | 11 +++- src/pokenav_match_call_list.c | 2 + src/pokenav_menu_handler_gfx.c | 30 +++++---- src/pokenav_ribbons_summary.c | 2 + src/strings.c | 84 ------------------------ 11 files changed, 90 insertions(+), 223 deletions(-) diff --git a/include/strings.h b/include/strings.h index 7ad99aad56..80df986993 100644 --- a/include/strings.h +++ b/include/strings.h @@ -986,23 +986,6 @@ extern const u8 gText_SomeonesPC[]; extern const u8 gText_PlayersPC[]; extern const u8 gText_WhichPCShouldBeAccessed[]; -extern const u8 gText_PokenavMatchCall_Strategy[]; -extern const u8 gText_PokenavMatchCall_TrainerPokemon[]; -extern const u8 gText_PokenavMatchCall_SelfIntroduction[]; -extern const u8 gText_Pokenav_ClearButtonList[]; -extern const u8 gText_PokenavMap_ZoomedOutButtons[]; -extern const u8 gText_PokenavMap_ZoomedInButtons[]; -extern const u8 gText_PokenavCondition_MonListButtons[]; -extern const u8 gText_PokenavCondition_MonStatusButtons[]; -extern const u8 gText_PokenavCondition_MarkingButtons[]; -extern const u8 gText_PokenavMatchCall_TrainerListButtons[]; -extern const u8 gText_PokenavMatchCall_CallMenuButtons[]; -extern const u8 gText_PokenavMatchCall_CheckTrainerButtons[]; -extern const u8 gText_PokenavRibbons_MonListButtons[]; -extern const u8 gText_PokenavRibbons_RibbonListButtons[]; -extern const u8 gText_PokenavRibbons_RibbonCheckButtons[]; -extern const u8 gText_Number2[]; - extern const u8 gText_Petalburg[]; extern const u8 gText_Slateport[]; extern const u8 gText_Enter2[]; @@ -2443,43 +2426,6 @@ extern const u8 MatchCall_Text_Phoebe[]; extern const u8 MatchCall_Text_Glacia[]; extern const u8 MatchCall_Text_Drake[]; extern const u8 MatchCall_Text_Wallace[]; -extern const u8 gText_MrStoneMatchCallDesc[]; -extern const u8 gText_MrStoneMatchCallName[]; -extern const u8 gText_StevenMatchCallDesc[]; -extern const u8 gText_StevenMatchCallName[]; -extern const u8 gText_MayBrendanMatchCallDesc[]; -extern const u8 gText_WallyMatchCallDesc[]; -extern const u8 gText_NormanMatchCallDesc[]; -extern const u8 gText_NormanMatchCallName[]; -extern const u8 gText_MomMatchCallDesc[]; -extern const u8 gText_MomMatchCallName[]; -extern const u8 gText_ScottMatchCallDesc[]; -extern const u8 gText_ScottMatchCallName[]; -extern const u8 gText_RoxanneMatchCallDesc[]; -extern const u8 gText_BrawlyMatchCallDesc[]; -extern const u8 gText_WattsonMatchCallDesc[]; -extern const u8 gText_FlanneryMatchCallDesc[]; -extern const u8 gText_WinonaMatchCallDesc[]; -extern const u8 gText_TateLizaMatchCallDesc[]; -extern const u8 gText_JuanMatchCallDesc[]; -extern const u8 gText_EliteFourMatchCallDesc[]; -extern const u8 gText_ChampionMatchCallDesc[]; -extern const u8 gText_ProfBirchMatchCallDesc[]; -extern const u8 gText_ProfBirchMatchCallName[]; -extern const u8 gText_MatchCallSteven_Strategy[]; -extern const u8 gText_MatchCallSteven_Pokemon[]; -extern const u8 gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle[]; -extern const u8 gText_MatchCallSteven_Intro2_BeforeMeteorFallsBattle[]; -extern const u8 gText_MatchCallSteven_Intro1_AfterMeteorFallsBattle[]; -extern const u8 gText_MatchCallSteven_Intro2_AfterMeteorFallsBattle[]; -extern const u8 gText_MatchCallBrendan_Strategy[]; -extern const u8 gText_MatchCallBrendan_Pokemon[]; -extern const u8 gText_MatchCallBrendan_Intro1[]; -extern const u8 gText_MatchCallBrendan_Intro2[]; -extern const u8 gText_MatchCallMay_Strategy[]; -extern const u8 gText_MatchCallMay_Pokemon[]; -extern const u8 gText_MatchCallMay_Intro1[]; -extern const u8 gText_MatchCallMay_Intro2[]; // Contest Link extern const u8 gText_ColorDarkGray[]; @@ -2897,37 +2843,6 @@ extern const u8 gText_CutenessContest[]; extern const u8 gText_SmartnessContest[]; extern const u8 gText_ToughnessContest[]; -// PokéNav Match Call -extern const u8 gText_CallCantBeMadeHere[]; -extern const u8 gText_NumberRegistered[]; -extern const u8 gText_NumberOfBattles[]; -extern const u8 gText_Unknown[]; -extern const u8 gText_TrainerCloseBy[]; -extern const u8 gText_Call[]; -extern const u8 gText_Check[]; -extern const u8 gText_Cancel6[]; - -// PokéNav Menu Handler -extern const u8 gText_CheckMapOfHoenn[]; -extern const u8 gText_CheckPokemonInDetail[]; -extern const u8 gText_CallRegisteredTrainer[]; -extern const u8 gText_CheckObtainedRibbons[]; -extern const u8 gText_PutAwayPokenav[]; -extern const u8 gText_CheckPartyPokemonInDetail[]; -extern const u8 gText_CheckAllPokemonInDetail[]; -extern const u8 gText_ReturnToPokenavMenu[]; -extern const u8 gText_FindCoolPokemon[]; -extern const u8 gText_FindBeautifulPokemon[]; -extern const u8 gText_FindCutePokemon[]; -extern const u8 gText_FindSmartPokemon[]; -extern const u8 gText_FindToughPokemon[]; -extern const u8 gText_ReturnToConditionMenu[]; -extern const u8 gText_NoRibbonWinners[]; - -// PokéNav -extern const u8 gText_NumberIndex[]; -extern const u8 gText_RibbonsF700[]; - // use_pokeblock extern const u8 gText_Coolness[]; extern const u8 gText_Toughness[]; diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index 26d8e99e06..8845307c0e 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -30,6 +30,8 @@ static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condit static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.lz"); static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/pokenav/condition/mon_markings.gbapal"); +static const u8 gText_Number2[] = _("No. "); + static const struct BgTemplate sMenuBgTemplates[3] = { { diff --git a/src/pokenav_conditions_search_results.c b/src/pokenav_conditions_search_results.c index 9afb2bb2d9..4889dd788c 100644 --- a/src/pokenav_conditions_search_results.c +++ b/src/pokenav_conditions_search_results.c @@ -22,6 +22,8 @@ enum CONDITION_SEARCH_FUNC_SELECT_MON, }; +static const u8 gText_NumberIndex[] = _("No. {DYNAMIC 0}"); + struct Pokenav_SearchResults { u32 (*callback)(struct Pokenav_SearchResults *); diff --git a/src/pokenav_list.c b/src/pokenav_list.c index ed3d40dee2..dbcf137331 100644 --- a/src/pokenav_list.c +++ b/src/pokenav_list.c @@ -96,6 +96,10 @@ static u32 LoopedTask_PrintCheckPageInfo(s32); static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); +static const u8 gText_PokenavMatchCall_Strategy[] = _("STRATEGY"); +static const u8 gText_PokenavMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); +static const u8 gText_PokenavMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION"); + static EWRAM_DATA u32 sMoveWindowDownIndex = 0; // Read, but pointlessly bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset) diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index 761f572d6b..dfd656833d 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -86,18 +86,18 @@ static const struct WindowTemplate sHelpBarWindowTemplate[] = static const u8 *const sHelpBarTexts[HELPBAR_COUNT] = { - [HELPBAR_NONE] = gText_Pokenav_ClearButtonList, - [HELPBAR_MAP_ZOOMED_OUT] = gText_PokenavMap_ZoomedOutButtons, - [HELPBAR_MAP_ZOOMED_IN] = gText_PokenavMap_ZoomedInButtons, - [HELPBAR_CONDITION_MON_LIST] = gText_PokenavCondition_MonListButtons, - [HELPBAR_CONDITION_MON_STATUS] = gText_PokenavCondition_MonStatusButtons, - [HELPBAR_CONDITION_MARKINGS] = gText_PokenavCondition_MarkingButtons, - [HELPBAR_MC_TRAINER_LIST] = gText_PokenavMatchCall_TrainerListButtons, - [HELPBAR_MC_CALL_MENU] = gText_PokenavMatchCall_CallMenuButtons, - [HELPBAR_MC_CHECK_PAGE] = gText_PokenavMatchCall_CheckTrainerButtons, - [HELPBAR_RIBBONS_MON_LIST] = gText_PokenavRibbons_MonListButtons, - [HELPBAR_RIBBONS_LIST] = gText_PokenavRibbons_RibbonListButtons, - [HELPBAR_RIBBONS_CHECK] = gText_PokenavRibbons_RibbonCheckButtons, + [HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"), + [HELPBAR_MAP_ZOOMED_OUT] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"), + [HELPBAR_MAP_ZOOMED_IN] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL"), + [HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"), + [HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"), + [HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"), + [HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"), + [HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"), + [HELPBAR_MC_CHECK_PAGE] = COMPOUND_STRING("{B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_MON_LIST] = COMPOUND_STRING("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_LIST] = COMPOUND_STRING("{A_BUTTON}CHECK {B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_CHECK] = COMPOUND_STRING("{B_BUTTON}CANCEL"), }; static const u8 sHelpBarTextColors[3] = diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c index ca027380d4..a2cf3f93c4 100644 --- a/src/pokenav_match_call_data.c +++ b/src/pokenav_match_call_data.c @@ -179,8 +179,8 @@ static const struct MatchCallStructNPC sMrStoneMatchCallHeader = .type = MC_TYPE_NPC, .mapSec = MAPSEC_RUSTBORO_CITY, .flag = 0xFFFF, - .desc = gText_MrStoneMatchCallDesc, - .name = gText_MrStoneMatchCallName, + .desc = COMPOUND_STRING("DEVON PRES"), + .name = COMPOUND_STRING("MR. STONE"), .textData = sMrStoneTextScripts }; @@ -203,8 +203,8 @@ static const struct MatchCallStructTrainer sNormanMatchCallHeader = .mapSec = MAPSEC_PETALBURG_CITY, .flag = FLAG_ENABLE_NORMAN_MATCH_CALL, .rematchTableIdx = REMATCH_NORMAN, - .desc = gText_NormanMatchCallDesc, - .name = gText_NormanMatchCallName, + .desc = COMPOUND_STRING("RELIABLE ONE"), + .name = COMPOUND_STRING("DAD"), .textData = sNormanTextScripts }; @@ -213,8 +213,8 @@ static const struct MatchCallBirch sProfBirchMatchCallHeader = .type = MC_TYPE_BIRCH, .mapSec = 0, .flag = FLAG_ENABLE_PROF_BIRCH_MATCH_CALL, - .desc = gText_ProfBirchMatchCallDesc, - .name = gText_ProfBirchMatchCallName + .desc = COMPOUND_STRING("{PKMN} PROF."), + .name = COMPOUND_STRING("PROF. BIRCH") }; static const match_call_text_data_t sMomTextScripts[] = { @@ -229,8 +229,8 @@ static const struct MatchCallStructNPC sMomMatchCallHeader = .type = MC_TYPE_NPC, .mapSec = MAPSEC_LITTLEROOT_TOWN, .flag = FLAG_ENABLE_MOM_MATCH_CALL, - .desc = gText_MomMatchCallDesc, - .name = gText_MomMatchCallName, + .desc = COMPOUND_STRING("CALM & KIND"), + .name = COMPOUND_STRING("MOM"), .textData = sMomTextScripts }; @@ -250,11 +250,13 @@ static const struct MatchCallStructNPC sStevenMatchCallHeader = .type = MC_TYPE_NPC, .mapSec = MAPSEC_NONE, .flag = FLAG_REGISTERED_STEVEN_POKENAV, - .desc = gText_StevenMatchCallDesc, - .name = gText_StevenMatchCallName, + .desc = COMPOUND_STRING("HARD AS ROCK"), + .name = COMPOUND_STRING("STEVEN"), .textData = sStevenTextScripts }; +static const u8 gText_MayBrendanMatchCallDesc[] = _("RAD NEIGHBOR"); + static const match_call_text_data_t sMayTextScripts[] = { { MatchCall_Text_May1, 0xFFFF, 0xFFFF }, { MatchCall_Text_May2, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, @@ -337,7 +339,7 @@ static const struct MatchCallWally sWallyMatchCallHeader = .mapSec = 0, .flag = FLAG_ENABLE_WALLY_MATCH_CALL, .rematchTableIdx = REMATCH_WALLY_VR, - .desc = gText_WallyMatchCallDesc, + .desc = COMPOUND_STRING("{PKMN} LOVER"), .textData = sWallyTextScripts, .locationData = sWallyLocationData }; @@ -359,8 +361,8 @@ static const struct MatchCallStructNPC sScottMatchCallHeader = .type = 0, .mapSec = MAPSEC_NONE, .flag = FLAG_ENABLE_SCOTT_MATCH_CALL, - .desc = gText_ScottMatchCallDesc, - .name = gText_ScottMatchCallName, + .desc = COMPOUND_STRING("ELUSIVE EYES"), + .name = COMPOUND_STRING("SCOTT"), .textData = sScottTextScripts }; @@ -378,7 +380,7 @@ static const struct MatchCallStructTrainer sRoxanneMatchCallHeader = .mapSec = MAPSEC_RUSTBORO_CITY, .flag = FLAG_ENABLE_ROXANNE_MATCH_CALL, .rematchTableIdx = REMATCH_ROXANNE, - .desc = gText_RoxanneMatchCallDesc, + .desc = COMPOUND_STRING("ROCKIN' WHIZ"), .name = NULL, .textData = sRoxanneTextScripts }; @@ -397,7 +399,7 @@ static const struct MatchCallStructTrainer sBrawlyMatchCallHeader = .mapSec = MAPSEC_DEWFORD_TOWN, .flag = FLAG_ENABLE_BRAWLY_MATCH_CALL, .rematchTableIdx = REMATCH_BRAWLY, - .desc = gText_BrawlyMatchCallDesc, + .desc = COMPOUND_STRING("THE BIG HIT"), .name = NULL, .textData = sBrawlyTextScripts }; @@ -416,7 +418,7 @@ static const struct MatchCallStructTrainer sWattsonMatchCallHeader = .mapSec = MAPSEC_MAUVILLE_CITY, .flag = FLAG_ENABLE_WATTSON_MATCH_CALL, .rematchTableIdx = REMATCH_WATTSON, - .desc = gText_WattsonMatchCallDesc, + .desc = COMPOUND_STRING("SWELL SHOCK"), .name = NULL, .textData = sWattsonTextScripts }; @@ -435,7 +437,7 @@ static const struct MatchCallStructTrainer sFlanneryMatchCallHeader = .mapSec = MAPSEC_LAVARIDGE_TOWN, .flag = FLAG_ENABLE_FLANNERY_MATCH_CALL, .rematchTableIdx = REMATCH_FLANNERY, - .desc = gText_FlanneryMatchCallDesc, + .desc = COMPOUND_STRING("PASSION BURN"), .name = NULL, .textData = sFlanneryTextScripts }; @@ -454,7 +456,7 @@ static const struct MatchCallStructTrainer sWinonaMatchCallHeader = .mapSec = MAPSEC_FORTREE_CITY, .flag = FLAG_ENABLE_WINONA_MATCH_CALL, .rematchTableIdx = REMATCH_WINONA, - .desc = gText_WinonaMatchCallDesc, + .desc = COMPOUND_STRING("SKY TAMER"), .name = NULL, .textData = sWinonaTextScripts }; @@ -473,7 +475,7 @@ static const struct MatchCallStructTrainer sTateLizaMatchCallHeader = .mapSec = MAPSEC_MOSSDEEP_CITY, .flag = FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL, .rematchTableIdx = REMATCH_TATE_AND_LIZA, - .desc = gText_TateLizaMatchCallDesc, + .desc = COMPOUND_STRING("MYSTIC DUO"), .name = NULL, .textData = sTateLizaTextScripts }; @@ -492,11 +494,13 @@ static const struct MatchCallStructTrainer sJuanMatchCallHeader = .mapSec = MAPSEC_SOOTOPOLIS_CITY, .flag = FLAG_ENABLE_JUAN_MATCH_CALL, .rematchTableIdx = REMATCH_JUAN, - .desc = gText_JuanMatchCallDesc, + .desc = COMPOUND_STRING("DANDY CHARM"), .name = NULL, .textData = sJuanTextScripts }; +static const u8 gText_EliteFourMatchCallDesc[] = _("ELITE FOUR"); + static const match_call_text_data_t sSidneyTextScripts[] = { { MatchCall_Text_Sidney, 0xFFFF, 0xFFFF }, { NULL, 0xFFFF, 0xFFFF } @@ -572,7 +576,7 @@ static const struct MatchCallStructTrainer sWallaceMatchCallHeader = .mapSec = MAPSEC_EVER_GRANDE_CITY, .flag = FLAG_REMATCH_WALLACE, .rematchTableIdx = REMATCH_WALLACE, - .desc = gText_ChampionMatchCallDesc, + .desc = COMPOUND_STRING("CHAMPION"), .name = NULL, .textData = sWallaceTextScripts }; @@ -657,6 +661,19 @@ static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 MatchCall_GetNameAndDesc_Birch }; +static const u8 gText_MatchCallSteven_Strategy[] = _("Attack the weak points!"); +static const u8 gText_MatchCallSteven_Pokemon[] = _("Ultimate STEEL POKéMON."); + +static const u8 gText_MatchCallBrendan_Strategy[] = _("Battle with knowledge!"); +static const u8 gText_MatchCallBrendan_Pokemon[] = _("I will use various POKéMON."); +static const u8 gText_MatchCallBrendan_Intro1[] = _("I'll be a better POKéMON"); +static const u8 gText_MatchCallBrendan_Intro2[] = _("prof than my father is!"); + +static const u8 gText_MatchCallMay_Strategy[] = _("I'm not so good at battles."); +static const u8 gText_MatchCallMay_Pokemon[] = _("I'll use any POKéMON!"); +static const u8 gText_MatchCallMay_Intro1[] = _("My POKéMON and I help"); +static const u8 gText_MatchCallMay_Intro2[] = _("my father's research."); + static const struct MatchCallCheckPageOverride sCheckPageOverrides[] = { { .idx = MC_HEADER_STEVEN, @@ -665,8 +682,8 @@ static const struct MatchCallCheckPageOverride sCheckPageOverrides[] = { .flavorTexts = { [CHECK_PAGE_STRATEGY] = gText_MatchCallSteven_Strategy, [CHECK_PAGE_POKEMON] = gText_MatchCallSteven_Pokemon, - [CHECK_PAGE_INTRO_1] = gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle, - [CHECK_PAGE_INTRO_2] = gText_MatchCallSteven_Intro2_BeforeMeteorFallsBattle + [CHECK_PAGE_INTRO_1] = COMPOUND_STRING("I'd climb even waterfalls"), + [CHECK_PAGE_INTRO_2] = COMPOUND_STRING("to find a rare stone!") } }, { @@ -676,8 +693,8 @@ static const struct MatchCallCheckPageOverride sCheckPageOverrides[] = { .flavorTexts = { [CHECK_PAGE_STRATEGY] = gText_MatchCallSteven_Strategy, [CHECK_PAGE_POKEMON] = gText_MatchCallSteven_Pokemon, - [CHECK_PAGE_INTRO_1] = gText_MatchCallSteven_Intro1_AfterMeteorFallsBattle, - [CHECK_PAGE_INTRO_2] = gText_MatchCallSteven_Intro2_AfterMeteorFallsBattle + [CHECK_PAGE_INTRO_1] = COMPOUND_STRING("I'm the strongest and most"), + [CHECK_PAGE_INTRO_2] = COMPOUND_STRING("energetic after all!") } }, { diff --git a/src/pokenav_match_call_gfx.c b/src/pokenav_match_call_gfx.c index 594b4d83d4..80e2709cf0 100755 --- a/src/pokenav_match_call_gfx.c +++ b/src/pokenav_match_call_gfx.c @@ -124,6 +124,11 @@ static const u16 sListWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/lis static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/pokenav/match_call/pokeball.gbapal"); static const u32 sPokeball_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/pokeball.4bpp.lz"); +static const u8 gText_NumberRegistered[] = _("No. registered"); +static const u8 gText_NumberOfBattles[] = _("No. of battles"); +static const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!"); +static const u8 gText_Unknown[] = _("UNKNOWN"); + static const struct BgTemplate sMatchCallBgTemplates[3] = { { @@ -199,9 +204,9 @@ static const struct WindowTemplate sMatchCallInfoBoxWindowTemplate = static const u8 *const sMatchCallOptionTexts[MATCH_CALL_OPTION_COUNT] = { - [MATCH_CALL_OPTION_CALL] = gText_Call, - [MATCH_CALL_OPTION_CHECK] = gText_Check, - [MATCH_CALL_OPTION_CANCEL] = gText_Cancel6 + [MATCH_CALL_OPTION_CALL] = COMPOUND_STRING("CALL"), + [MATCH_CALL_OPTION_CHECK] = COMPOUND_STRING("CHECK"), + [MATCH_CALL_OPTION_CANCEL] = COMPOUND_STRING("CANCEL") }; // The series of 5 dots that appear when someone is called with Match Call diff --git a/src/pokenav_match_call_list.c b/src/pokenav_match_call_list.c index 43cd5220dd..94a13031da 100755 --- a/src/pokenav_match_call_list.c +++ b/src/pokenav_match_call_list.c @@ -36,6 +36,8 @@ static u32 CB2_HandleCallExitInput(struct Pokenav_MatchCallMenu *); static u32 LoopedTask_BuildMatchCallList(s32); static bool32 ShouldDoNearbyMessage(void); +static const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here."); + #include "data/text/match_call_messages.h" static const u8 sMatchCallOptionsNoCheckPage[] = diff --git a/src/pokenav_menu_handler_gfx.c b/src/pokenav_menu_handler_gfx.c index b0128d385d..09fb96f3dc 100644 --- a/src/pokenav_menu_handler_gfx.c +++ b/src/pokenav_menu_handler_gfx.c @@ -108,6 +108,8 @@ static const u32 sPokenavDeviceBgTilemap[] = INCBIN_U32("graphics/pokenav/device static const u16 sMatchCallBlueLightPal[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal"); static const u32 sMatchCallBlueLightTiles[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); +static const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners."); + static const struct BgTemplate sPokenavMainMenuBgTemplates[] = { { .bg = 1, @@ -267,20 +269,20 @@ static const struct WindowTemplate sOptionDescWindowTemplate = static const u8 *const sPageDescriptions[] = { - [POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn, - [POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail, - [POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer, - [POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons, - [POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav, - [POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail, - [POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail, - [POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu, - [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = gText_ReturnToConditionMenu + [POKENAV_MENUITEM_MAP] = COMPOUND_STRING("Check the map of the HOENN region"), + [POKENAV_MENUITEM_CONDITION] = COMPOUND_STRING("Check POKéMON in detail."), + [POKENAV_MENUITEM_MATCH_CALL] = COMPOUND_STRING("Call a registered TRAINER."), + [POKENAV_MENUITEM_RIBBONS] = COMPOUND_STRING("Check obtained RIBBONS."), + [POKENAV_MENUITEM_SWITCH_OFF] = COMPOUND_STRING("Put away the POKéNAV."), + [POKENAV_MENUITEM_CONDITION_PARTY] = COMPOUND_STRING("Check party POKéMON in detail."), + [POKENAV_MENUITEM_CONDITION_SEARCH] = COMPOUND_STRING("Check all POKéMON in detail."), + [POKENAV_MENUITEM_CONDITION_CANCEL] = COMPOUND_STRING("Return to the POKéNAV menu."), + [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = COMPOUND_STRING("Find cool POKéMON."), + [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = COMPOUND_STRING("Find beautiful POKéMON."), + [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = COMPOUND_STRING("Find cute POKéMON."), + [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = COMPOUND_STRING("Find smart POKéMON."), + [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = COMPOUND_STRING("Find tough POKéMON."), + [POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = COMPOUND_STRING("Return to the CONDITION menu.") }; static const u8 sOptionDescTextColors[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN}; diff --git a/src/pokenav_ribbons_summary.c b/src/pokenav_ribbons_summary.c index bba1c3600c..9a5eafeea5 100644 --- a/src/pokenav_ribbons_summary.c +++ b/src/pokenav_ribbons_summary.c @@ -40,6 +40,8 @@ enum #define MON_SPRITE_X_OFF -32 #define MON_SPRITE_Y 104 +static const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}"); + struct Pokenav_RibbonsSummaryList { u8 unused1[8]; diff --git a/src/strings.c b/src/strings.c index a5533731ed..54a08f32e2 100644 --- a/src/strings.c +++ b/src/strings.c @@ -20,7 +20,6 @@ const u8 gText_ExpandedPlaceholder_Brendan[] = _("BRENDAN"); const u8 gText_ExpandedPlaceholder_May[] = _("MAY"); const u8 gText_EggNickname[] = _("EGG"); const u8 gText_Pokemon[] = _("POKéMON"); -const u8 gText_ProfBirchMatchCallName[] = _("PROF. BIRCH"); const u8 gText_Player[] = _("PLAYER"); // Unused const u8 gText_Pokedex[] = _("POKéDEX"); // Unused const u8 gText_Time[] = _("TIME"); @@ -897,57 +896,11 @@ const u8 gText_SeeYaDescription[] = _("Return to the previous menu."); const u8 gText_JustOnePkmn[] = _("There is just one POKéMON with you."); const u8 gText_PartyFull[] = _("Your party is full!"); const u8 gText_Box[] = _("BOX"); -const u8 gText_CheckMapOfHoenn[] = _("Check the map of the HOENN region."); -const u8 gText_CheckPokemonInDetail[] = _("Check POKéMON in detail."); -const u8 gText_CallRegisteredTrainer[] = _("Call a registered TRAINER."); -const u8 gText_CheckObtainedRibbons[] = _("Check obtained RIBBONS."); -const u8 gText_PutAwayPokenav[] = _("Put away the POKéNAV."); -const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners."); -const u8 gText_NoTrainersRegistered[] = _("No TRAINERS are registered."); // Unused -const u8 gText_CheckPartyPokemonInDetail[] = _("Check party POKéMON in detail."); -const u8 gText_CheckAllPokemonInDetail[] = _("Check all POKéMON in detail."); -const u8 gText_ReturnToPokenavMenu[] = _("Return to the POKéNAV menu."); -const u8 gText_FindCoolPokemon[] = _("Find cool POKéMON."); -const u8 gText_FindBeautifulPokemon[] = _("Find beautiful POKéMON."); -const u8 gText_FindCutePokemon[] = _("Find cute POKéMON."); -const u8 gText_FindSmartPokemon[] = _("Find smart POKéMON."); -const u8 gText_FindToughPokemon[] = _("Find tough POKéMON."); -const u8 gText_ReturnToConditionMenu[] = _("Return to the CONDITION menu."); -const u8 gText_NumberRegistered[] = _("No. registered"); -const u8 gText_NumberOfBattles[] = _("No. of battles"); -const u8 gText_Detail[] = _("DETAIL"); // Unused -const u8 gText_Call2[] = _("CALL"); // Unused -const u8 gText_UnusedExit[] = _("EXIT"); // Unused -const u8 gText_CantCallOpponentHere[] = _("Can't call opponent here."); // Unused -const u8 gText_PokenavMatchCall_Strategy[] = _("STRATEGY"); -const u8 gText_PokenavMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); -const u8 gText_PokenavMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION"); -const u8 gText_Pokenav_ClearButtonList[] = _("{CLEAR 0x80}"); -const u8 gText_PokenavMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"); -const u8 gText_PokenavMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL"); -const u8 gText_PokenavCondition_MonListButtons[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"); -const u8 gText_PokenavCondition_MonStatusButtons[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"); -const u8 gText_PokenavCondition_MarkingButtons[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"); -const u8 gText_PokenavMatchCall_TrainerListButtons[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL"); -const u8 gText_PokenavMatchCall_CallMenuButtons[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL"); -const u8 gText_PokenavMatchCall_CheckTrainerButtons[] = _("{B_BUTTON}CANCEL"); -const u8 gText_PokenavRibbons_MonListButtons[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"); -const u8 gText_PokenavRibbons_RibbonListButtons[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL"); -const u8 gText_PokenavRibbons_RibbonCheckButtons[] = _("{B_BUTTON}CANCEL"); const u8 gText_NatureSlash[] = _("NATURE/"); -const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!"); const u8 gText_InParty[] = _("IN PARTY"); -const u8 gText_Number2[] = _("No. "); -const u8 gText_Ribbons[] = _("RIBBONS"); // Unused const u8 gText_PokemonMaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}"); // Unused const u8 gText_PokemonFemaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}"); // Unused const u8 gText_PokemonNoGenderLv[] = _("{DYNAMIC 0}/{LV}{DYNAMIC 1}"); // Unused -const u8 gText_Unknown[] = _("UNKNOWN"); -const u8 gText_Call[] = _("CALL"); -const u8 gText_Check[] = _("CHECK"); -const u8 gText_Cancel6[] = _("CANCEL"); -const u8 gText_NumberIndex[] = _("No. {DYNAMIC 0}"); -const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}"); const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_PokemonNoGenderLv2[] = _("{DYNAMIC 0}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused @@ -1240,20 +1193,6 @@ const u8 gText_ThankYou[] = _("THANK YOU"); const u8 gText_ByeBye[] = _("BYE-BYE!"); const u8 gText_PlayerScurriedToCenter[] = _("{PLAYER} scurried to a POKéMON CENTER,\nprotecting the exhausted and fainted\nPOKéMON from further harm…\p"); const u8 gText_PlayerScurriedBackHome[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKéMON from\nfurther harm…\p"); -const u8 gText_MatchCallSteven_Strategy[] = _("Attack the weak points!"); -const u8 gText_MatchCallSteven_Pokemon[] = _("Ultimate STEEL POKéMON."); -const u8 gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle[] = _("I'd climb even waterfalls"); -const u8 gText_MatchCallSteven_Intro2_BeforeMeteorFallsBattle[] = _("to find a rare stone!"); -const u8 gText_MatchCallSteven_Intro1_AfterMeteorFallsBattle[] = _("I'm the strongest and most"); -const u8 gText_MatchCallSteven_Intro2_AfterMeteorFallsBattle[] = _("energetic after all!"); -const u8 gText_MatchCallBrendan_Strategy[] = _("Battle with knowledge!"); -const u8 gText_MatchCallBrendan_Pokemon[] = _("I will use various POKéMON."); -const u8 gText_MatchCallBrendan_Intro1[] = _("I'll be a better POKéMON"); -const u8 gText_MatchCallBrendan_Intro2[] = _("prof than my father is!"); -const u8 gText_MatchCallMay_Strategy[] = _("I'm not so good at battles."); -const u8 gText_MatchCallMay_Pokemon[] = _("I'll use any POKéMON!"); -const u8 gText_MatchCallMay_Intro1[] = _("My POKéMON and I help"); -const u8 gText_MatchCallMay_Intro2[] = _("my father's research."); const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); const u8 gText_NicknameHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); ALIGNED(4) const u8 gText_ReadyPickBerry[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); @@ -1549,7 +1488,6 @@ const u8 gText_BoxName[] = _("BOX NAME?"); const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?"); const u8 gText_TellHimTheWords[] = _("Tell him the words."); const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK"); -const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here."); const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON"); const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON."); const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON."); @@ -1720,28 +1658,6 @@ const u8 gText_ClearingData[] = _("Clearing data…\nPlease wait."); const u8 gText_IsThisTheCorrectTime[] = _("Is this the correct time?"); const u8 gText_Confirm3[] = _("CONFIRM"); const u8 gText_Cancel4[] = _("CANCEL"); -const u8 gText_MrStoneMatchCallDesc[] = _("DEVON PRES"); -const u8 gText_MrStoneMatchCallName[] = _("MR. STONE"); -const u8 gText_StevenMatchCallDesc[] = _("HARD AS ROCK"); -const u8 gText_StevenMatchCallName[] = _("STEVEN"); -const u8 gText_MayBrendanMatchCallDesc[] = _("RAD NEIGHBOR"); -const u8 gText_NormanMatchCallDesc[] = _("RELIABLE ONE"); -const u8 gText_MomMatchCallDesc[] = _("CALM & KIND"); -const u8 gText_WallyMatchCallDesc[] = _("{PKMN} LOVER"); -const u8 gText_NormanMatchCallName[] = _("DAD"); -const u8 gText_MomMatchCallName[] = _("MOM"); -const u8 gText_ScottMatchCallDesc[] = _("ELUSIVE EYES"); -const u8 gText_ScottMatchCallName[] = _("SCOTT"); -const u8 gText_RoxanneMatchCallDesc[] = _("ROCKIN' WHIZ"); -const u8 gText_BrawlyMatchCallDesc[] = _("THE BIG HIT"); -const u8 gText_WattsonMatchCallDesc[] = _("SWELL SHOCK"); -const u8 gText_FlanneryMatchCallDesc[] = _("PASSION BURN"); -const u8 gText_WinonaMatchCallDesc[] = _("SKY TAMER"); -const u8 gText_TateLizaMatchCallDesc[] = _("MYSTIC DUO"); -const u8 gText_JuanMatchCallDesc[] = _("DANDY CHARM"); -const u8 gText_EliteFourMatchCallDesc[] = _("ELITE FOUR"); -const u8 gText_ChampionMatchCallDesc[] = _("CHAMPION"); -const u8 gText_ProfBirchMatchCallDesc[] = _("{PKMN} PROF."); const u8 gText_CommStandbyAwaitingOtherPlayer[] = _("Communication standby…\nAwaiting another player to choose."); const u8 gText_BattleWasRefused[] = _("The battle was refused.{PAUSE 60}"); const u8 gText_RefusedBattle[] = _("Refused the battle.{PAUSE 60}"); From b641c6f4fa33127052b0a59f1088fc3192f5e011 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 16 Aug 2024 23:02:49 +0200 Subject: [PATCH 105/225] Fixed incorrect weather damage rounding when maxHP <16 (#5183) Co-authored-by: Hedara --- src/battle_ai_switch_items.c | 2 +- src/battle_ai_util.c | 4 ++-- src/battle_util.c | 6 +++++- test/battle/ability/ice_body.c | 30 +++++++++++++++++++++++++++--- test/battle/ability/rain_dish.c | 18 ++++++++++++++++-- test/battle/weather/hail.c | 12 ++++++++++++ test/battle/weather/sandstorm.c | 12 ++++++++++++ 7 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 29642df9ff..e0359ff00f 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1564,9 +1564,9 @@ static u32 GetSwitchinStatusDamage(u32 battler) if ((status & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns AI_DATA->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); statusDamage = maxHP / 16; - statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; if (statusDamage == 0) statusDamage = 1; + statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; } } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a094dfd694..30bce86c3d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2514,7 +2514,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId) bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) { if ((BattlerAffectedBySandstorm(battler, ability) || BattlerAffectedByHail(battler, ability)) - && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 16) + && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) return TRUE; return FALSE; @@ -2523,7 +2523,7 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability) { if (GetBattlerSecondaryDamage(battler) != 0 - && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 16) + && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) return TRUE; return FALSE; } diff --git a/src/battle_util.c b/src/battle_util.c index 0a680cc272..aefce1f0a9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2379,6 +2379,8 @@ u8 DoBattlerEndTurnEffects(void) { gBattleScripting.battler = battler; gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_DamagingWeather); effect++; } @@ -2389,7 +2391,7 @@ u8 DoBattlerEndTurnEffects(void) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { gBattleScripting.battler = battler; - gBattleMoveDamage = -1 * (GetNonDynamaxMaxHP(battler) / 16); + gBattleMoveDamage = -1 * max(1, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_IceBodyHeal); effect++; } @@ -2403,6 +2405,8 @@ u8 DoBattlerEndTurnEffects(void) { gBattleScripting.battler = battler; gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_DamagingWeather); effect++; } diff --git a/test/battle/ability/ice_body.c b/test/battle/ability/ice_body.c index 304059a00e..3f278a50cd 100644 --- a/test/battle/ability/ice_body.c +++ b/test/battle/ability/ice_body.c @@ -1,13 +1,21 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS { + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); +} + SINGLE_BATTLE_TEST("Ice Body prevents damage from hail") { + u32 move; + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); } } WHEN { - TURN { MOVE(player, MOVE_HAIL); MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { MOVE(player, move); MOVE(opponent, MOVE_SKILL_SWAP); } } SCENE { NONE_OF { HP_BAR(player); } } @@ -15,11 +23,14 @@ SINGLE_BATTLE_TEST("Ice Body prevents damage from hail") SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.") { + u32 move; + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { PLAYER(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_HAIL); } + TURN { MOVE(opponent, move); } } SCENE { ABILITY_POPUP(player, ABILITY_ICE_BODY); HP_BAR(player, damage: -(100 / 16)); @@ -27,4 +38,17 @@ SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.") } } -TO_DO_BATTLE_TEST("Sand Rush doesn't recover HP if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Ice Body doesn't recover HP if Cloud Nine/Air Lock is on the field") +{ + u32 move; + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + GIVEN { + PLAYER(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); HP(1); MaxHP(100); } + OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_ICE_BODY); + } +} diff --git a/test/battle/ability/rain_dish.c b/test/battle/ability/rain_dish.c index ed71a67f92..93f642c633 100644 --- a/test/battle/ability/rain_dish.c +++ b/test/battle/ability/rain_dish.c @@ -1,6 +1,10 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS { + ASSUME(gMovesInfo[MOVE_RAIN_DANCE].effect == EFFECT_RAIN_DANCE); +} + SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain") { GIVEN { @@ -11,8 +15,18 @@ SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain") } SCENE { ABILITY_POPUP(player, ABILITY_RAIN_DISH); MESSAGE("Ludicolo's Rain Dish restored its HP a little!"); - HP_BAR(player, damage: -(100 / 16)); + HP_BAR(player, damage: -(100 / 16)); } } -TO_DO_BATTLE_TEST("Rain Dish doesn't recover HP if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Rain Dish doesn't recover HP if Cloud Nine/Air Lock is on the field") +{ + GIVEN { + PLAYER(SPECIES_LUDICOLO) { Ability(ABILITY_RAIN_DISH); HP(1); MaxHP(100); } + OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } + } WHEN { + TURN { MOVE(opponent, MOVE_RAIN_DANCE); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_RAIN_DISH); + } +} diff --git a/test/battle/weather/hail.c b/test/battle/weather/hail.c index 5caeb84891..4210a22d9e 100644 --- a/test/battle/weather/hail.c +++ b/test/battle/weather/hail.c @@ -70,3 +70,15 @@ DOUBLE_BATTLE_TEST("Hail deals damage based on turn order") HP_BAR(playerRight); } } + +SINGLE_BATTLE_TEST("Hail damage rounds properly when maxHP < 16") +{ + GIVEN { + PLAYER(SPECIES_MAGIKARP) { Level(1); MaxHP(11); HP(11); } + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(opponent, MOVE_HAIL); } + } SCENE { + HP_BAR(player, damage: 1); + } +} diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 63b24afd7e..1673c26f99 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -82,3 +82,15 @@ DOUBLE_BATTLE_TEST("Sandstorm deals damage based on turn order") HP_BAR(playerRight); } } + +SINGLE_BATTLE_TEST("Sandstorm damage rounds properly when maxHP < 16") +{ + GIVEN { + PLAYER(SPECIES_MAGIKARP) { Level(1); MaxHP(11); HP(11); } + OPPONENT(SPECIES_SANDSLASH); + } WHEN { + TURN { MOVE(opponent, MOVE_SANDSTORM); } + } SCENE { + HP_BAR(player, damage: 1); + } +} From 15348eae84b9480c832f43c48a36589cf34b58e0 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:31:19 -0400 Subject: [PATCH 106/225] Consolidated the values of Rotom's moves and added Gen9 base form effect (#5186) * Consolidated Rotom move values * Updated changing Rotom into its base form to its Gen9 effect * Fixed order of if statement --- include/config/item.h | 1 + src/data/party_menu.h | 17 ++++++++++++----- src/party_menu.c | 16 ++++++++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/include/config/item.h b/include/config/item.h index 644a73ade6..2f60739335 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -19,6 +19,7 @@ #define I_BERRY_PRICE GEN_7 // Since Berries have become unplantable (Gen8+), their price has gone up. #define I_POWER_ITEM_BOOST GEN_LATEST // In Gen7+, Power Items grant 8 EVs instead of 4 EVs. #define I_PREMIER_BALL_BONUS GEN_LATEST // In LGPE onwards (Gen8+ here), you are given a Premier Ball for every 10 Poké Balls of any type and in the same purchase. Previously, it only applied to regular Poké Balls and only 1 could be obtained per purchase. +#define I_ROTOM_CATALOG_THUNDER_SHOCK GEN_LATEST // In Gen9+, reverting Rotom to its base form will teach it Thunder Shock even if it knows another move. // TM config #define I_REUSABLE_TMS FALSE // In Gen5-8, TMs are reusable. Setting this to TRUE will make all vanilla TMs reusable, though they can also be cherry-picked by setting their importance to 1. diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 99488d4ebe..841cedca88 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -1140,11 +1140,18 @@ static const u8 *const sUnused_StatStrings[] = gText_Speed2 }; +#define ROTOM_BASE_MOVE MOVE_THUNDER_SHOCK +#define ROTOM_HEAT_MOVE MOVE_OVERHEAT +#define ROTOM_WASH_MOVE MOVE_HYDRO_PUMP +#define ROTOM_FROST_MOVE MOVE_BLIZZARD +#define ROTOM_FAN_MOVE MOVE_AIR_SLASH +#define ROTOM_MOW_MOVE MOVE_LEAF_STORM + static const u16 sRotomFormChangeMoves[5] = { - MOVE_HYDRO_PUMP, - MOVE_BLIZZARD, - MOVE_OVERHEAT, - MOVE_AIR_SLASH, - MOVE_LEAF_STORM, + ROTOM_HEAT_MOVE, + ROTOM_WASH_MOVE, + ROTOM_FROST_MOVE, + ROTOM_FAN_MOVE, + ROTOM_MOW_MOVE, }; diff --git a/src/party_menu.c b/src/party_menu.c index 15433854a5..5def34b3eb 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -6413,13 +6413,13 @@ static void Task_TryItemUseFormChange(u8 taskId) case 6: if (!IsPartyMenuTextPrinterActive()) { - if (gSpecialVar_ItemId == ITEM_ROTOM_CATALOG) //only for rotom currently + if (gSpecialVar_ItemId == ITEM_ROTOM_CATALOG) //only for Rotom currently { u32 i; for (i = 0; i < ARRAY_COUNT(sRotomFormChangeMoves); i++) DeleteMove(mon, sRotomFormChangeMoves[i]); - if (gSpecialVar_0x8000 == MOVE_THUNDER_SHOCK) + if (I_ROTOM_CATALOG_THUNDER_SHOCK < GEN_9 && gSpecialVar_0x8000 == ROTOM_BASE_MOVE) { if (!DoesMonHaveAnyMoves(mon)) FormChangeTeachMove(taskId, gSpecialVar_0x8000, gPartyMenu.slotId); @@ -6517,42 +6517,42 @@ bool32 TryMultichoiceFormChange(u8 taskId) static void CursorCb_CatalogBulb(u8 taskId) { gSpecialVar_Result = 0; - gSpecialVar_0x8000 = MOVE_THUNDER_SHOCK; + gSpecialVar_0x8000 = ROTOM_BASE_MOVE; TryMultichoiceFormChange(taskId); } static void CursorCb_CatalogOven(u8 taskId) { gSpecialVar_Result = 1; - gSpecialVar_0x8000 = MOVE_OVERHEAT; + gSpecialVar_0x8000 = ROTOM_HEAT_MOVE; TryMultichoiceFormChange(taskId); } static void CursorCb_CatalogWashing(u8 taskId) { gSpecialVar_Result = 2; - gSpecialVar_0x8000 = MOVE_HYDRO_PUMP; + gSpecialVar_0x8000 = ROTOM_WASH_MOVE; TryMultichoiceFormChange(taskId); } static void CursorCb_CatalogFridge(u8 taskId) { gSpecialVar_Result = 3; - gSpecialVar_0x8000 = MOVE_BLIZZARD; + gSpecialVar_0x8000 = ROTOM_FROST_MOVE; TryMultichoiceFormChange(taskId); } static void CursorCb_CatalogFan(u8 taskId) { gSpecialVar_Result = 4; - gSpecialVar_0x8000 = MOVE_AIR_SLASH; + gSpecialVar_0x8000 = ROTOM_FAN_MOVE; TryMultichoiceFormChange(taskId); } static void CursorCb_CatalogMower(u8 taskId) { gSpecialVar_Result = 5; - gSpecialVar_0x8000 = MOVE_LEAF_STORM; + gSpecialVar_0x8000 = ROTOM_MOW_MOVE; TryMultichoiceFormChange(taskId); } From e4c81ba6e0fb353589262869b09f7fac4bf87c5c Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 17 Aug 2024 17:28:09 +0200 Subject: [PATCH 107/225] Removed all instances of gBitTable[x] (#5123) * Replaced all the gBitTable[X] usages with 1 << X, and cleaned up script output * Fixed failed merge in online viewer --------- Co-authored-by: Hedara --- include/battle.h | 6 +- include/constants/battle.h | 6 +- include/util.h | 1 - src/battle_ai_main.c | 8 +- src/battle_ai_switch_items.c | 42 ++-- src/battle_ai_util.c | 18 +- src/battle_arena.c | 4 +- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 6 +- src/battle_controller_player.c | 20 +- src/battle_controller_player_partner.c | 6 +- src/battle_controller_recorded_opponent.c | 4 +- src/battle_controller_recorded_player.c | 4 +- src/battle_controller_safari.c | 4 +- src/battle_controller_wally.c | 4 +- src/battle_controllers.c | 6 +- src/battle_dome.c | 18 +- src/battle_gfx_sfx_util.c | 14 +- src/battle_gimmick.c | 4 +- src/battle_interface.c | 10 +- src/battle_main.c | 64 +++--- src/battle_pyramid.c | 10 +- src/battle_script_commands.c | 250 +++++++++++----------- src/battle_terastal.c | 4 +- src/battle_util.c | 154 ++++++------- src/battle_z_move.c | 4 +- src/pokemon.c | 14 +- src/recorded_battle.c | 2 +- src/script_movement.c | 6 +- src/trainer_hill.c | 6 +- src/util.c | 36 ---- test/test_runner_battle.c | 18 +- 33 files changed, 362 insertions(+), 399 deletions(-) diff --git a/include/battle.h b/include/battle.h index 28a6dd0f36..57242e4bd7 100644 --- a/include/battle.h +++ b/include/battle.h @@ -42,7 +42,7 @@ // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ - && !(gDisableStructs[battler].mimickedMoves & gBitTable[moveSlot])) + && !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot))) // Battle Actions // These determine what each battler will do in a turn @@ -819,8 +819,8 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define IS_MOVE_RECOIL(move)(gMovesInfo[move].recoil > 0 || gMovesInfo[move].effect == EFFECT_RECOIL_IF_MISS) #define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) -#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[gBattlerTarget])) -#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[battler])) +#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << gBattlerTarget))) +#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << battler))) #define IS_BATTLER_OF_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, FALSE) == type || GetBattlerType(battlerId, 1, FALSE) == type || (GetBattlerType(battlerId, 2, FALSE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == type))) #define IS_BATTLER_OF_BASE_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, TRUE) == type || GetBattlerType(battlerId, 1, TRUE) == type || (GetBattlerType(battlerId, 2, TRUE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, TRUE) == type))) diff --git a/include/constants/battle.h b/include/constants/battle.h index 39d52d3a45..f9800ef4b3 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -137,7 +137,7 @@ #define STATUS2_WRAPPED (1 << 13) #define STATUS2_POWDER (1 << 14) #define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler -#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) +#define STATUS2_INFATUATED_WITH(battler) (1u << (battler + 16)) #define STATUS2_DEFENSE_CURL (1 << 20) #define STATUS2_TRANSFORMED (1 << 21) #define STATUS2_RECHARGE (1 << 22) @@ -217,8 +217,8 @@ #define HITMARKER_OBEYS (1 << 25) #define HITMARKER_NEVER_SET (1 << 26) // Cleared as part of a large group. Never set or checked #define HITMARKER_CHARGING (1 << 27) -#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28) -#define HITMARKER_FAINTED2(battler) ((1 << 28) << battler) +#define HITMARKER_FAINTED(battler) (1u << (battler + 28)) +#define HITMARKER_FAINTED2(battler) HITMARKER_FAINTED(battler) #define HITMARKER_STRING_PRINTED (1 << 29) // Per-side statuses that affect an entire party diff --git a/include/util.h b/include/util.h index 3c90f136a6..fcc4e37bb1 100644 --- a/include/util.h +++ b/include/util.h @@ -4,7 +4,6 @@ #include "sprite.h" extern const u8 gMiscBlank_Gfx[]; // unused in Emerald -extern const u32 gBitTable[]; u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *)); void StoreWordInTwoHalfwords(u16 *, u32); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index b0229cd926..df055d62ba 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -262,7 +262,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) // Ignore moves that aren't possible to use. for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBitTable[i] & moveLimitations) + if ((1u << i) & moveLimitations) SET_SCORE(battler, i, 0); } @@ -446,7 +446,7 @@ static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u3 if (move != 0 && move != 0xFFFF //&& gMovesInfo[move].power != 0 /* we want to get effectiveness and accuracy of status moves */ - && !(aiData->moveLimitations[battlerAtk] & gBitTable[i])) + && !(aiData->moveLimitations[battlerAtk] & (1u << i))) { if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, TRUE, weather, DMG_ROLL_HIGHEST); @@ -506,12 +506,12 @@ static bool32 AI_SwitchMonIfSuitable(u32 battler, bool32 doubleBattle) if (doubleBattle) { u32 partner = BATTLE_PARTNER(battler); - if (AI_DATA->shouldSwitchMon & gBitTable[partner] && AI_DATA->monToSwitchId[partner] == monToSwitchId) + if (AI_DATA->shouldSwitchMon & (1u << partner) && AI_DATA->monToSwitchId[partner] == monToSwitchId) { return FALSE; } } - AI_DATA->shouldSwitchMon |= gBitTable[battler]; + AI_DATA->shouldSwitchMon |= 1 << battler; AI_DATA->monToSwitchId[battler] = monToSwitchId; return TRUE; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index e1e25b5279..aca8687797 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -40,7 +40,7 @@ static void InitializeSwitchinCandidate(struct Pokemon *mon) static bool32 IsAceMon(u32 battler, u32 monPartyId) { if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && !(gBattleStruct->forcedSwitch & gBitTable[battler]) + && !(gBattleStruct->forcedSwitch & (1u << battler)) && monPartyId == CalculateEnemyPartyCount()-1) return TRUE; return FALSE; @@ -218,9 +218,9 @@ static bool32 HasBadOdds(u32 battler, bool32 emitResult) static bool32 ShouldSwitchIfAllBadMoves(u32 battler, bool32 emitResult) { - if (AI_DATA->shouldSwitchMon & gBitTable[battler]) + if (AI_DATA->shouldSwitchMon & (1u << battler)) { - AI_DATA->shouldSwitchMon &= ~(gBitTable[battler]); + AI_DATA->shouldSwitchMon &= ~(1u << battler); gBattleStruct->AI_monToSwitchIntoId[battler] = AI_DATA->monToSwitchId[battler]; if (emitResult) BtlController_EmitTwoReturnValues(battler, BUFFER_B, B_ACTION_SWITCH, 0); @@ -321,7 +321,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler, bool32 emitResult) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) battlerIn2 = battler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); @@ -690,7 +690,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u32 opposingBattler = GetBattlerAtPosition(opposingPosition); - if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) + if (!(gAbsentBattlerFlags & (1u << opposingBattler))) { for (i = 0; i < MAX_MON_MOVES; i++) { @@ -712,7 +712,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition)); - if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) + if (!(gAbsentBattlerFlags & (1u << opposingBattler))) { for (i = 0; i < MAX_MON_MOVES; i++) { @@ -768,7 +768,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 modu if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) battlerIn2 = battler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); @@ -849,7 +849,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) battlerIn2 = battler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); @@ -1028,7 +1028,7 @@ bool32 ShouldSwitch(u32 battler, bool32 emitResult) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) battlerIn2 = battler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); @@ -1197,14 +1197,14 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u for (i = firstId; i < lastId; i++) { - if (invalidMons & gBitTable[i]) + if (invalidMons & (1u << 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]; + bits |= 1u << i; break; } } @@ -1215,7 +1215,7 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u do { i = (Random() % (lastId - firstId)) + firstId; - } while (!(bits & gBitTable[i])); + } while (!(bits & (1 << i))); return i; } @@ -1233,7 +1233,7 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, // Find the mon whose type is the most suitable defensively. for (i = firstId; i < lastId; i++) { - if (!(gBitTable[i] & invalidMons) && !(gBitTable[i] & bits)) + if (!((1u << i) & invalidMons) && !((1u << i) & bits)) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); uq4_12_t typeEffectiveness = UQ_4_12(1.0); @@ -1273,7 +1273,7 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, 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. + bits |= (1u << bestMonId); // Sorry buddy, we want something better. } else { @@ -1295,7 +1295,7 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva // 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) + if ((1 << (i)) & invalidMons) continue; InitializeSwitchinCandidate(&party[i]); for (j = 0; j < MAX_MON_MOVES; j++) @@ -1735,7 +1735,7 @@ static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, do { return (Random() % (lastId - firstId)) + firstId; - } while (!(bits & gBitTable[currentMonId])); + } while (!(bits & (1 << (currentMonId)))); } // Catch any other cases (such as only one mon alive and it has Baton Pass) @@ -1875,7 +1875,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not if (aiMove == MOVE_BATON_PASS && ((hitsToKOAI > hitsToKOAIThreshold + 1 && AI_DATA->switchinCandidate.battleMon.speed < playerMonSpeed) || (hitsToKOAI > hitsToKOAIThreshold && AI_DATA->switchinCandidate.battleMon.speed > playerMonSpeed))) - bits |= gBitTable[i]; + bits |= 1u << i; // Check for mon with resistance and super effective move for GetBestMonTypeMatchup if (aiMove != MOVE_NONE && gMovesInfo[aiMove].power != 0) @@ -2045,13 +2045,13 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))]) + if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) battlerIn2 = battler; else battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); opposingBattler = BATTLE_OPPOSITE(battlerIn1); - if (gAbsentBattlerFlags & gBitTable[opposingBattler]) + if (gAbsentBattlerFlags & (1u << opposingBattler)) opposingBattler ^= BIT_FLANK; } else @@ -2097,12 +2097,12 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) || i == gBattleStruct->monToSwitchIntoId[battlerIn2] || (GetMonAbility(&party[i]) == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler))) // While not really invalid per se, not really wise to switch into this mon.) { - invalidMons |= gBitTable[i]; + invalidMons |= 1u << i; } else if (IsAceMon(battler, i))// Save Ace Pokemon for last. { aceMonId = i; - invalidMons |= gBitTable[i]; + invalidMons |= 1u << i; } else { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 03adcb1982..1cde7614ed 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -351,12 +351,12 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) == category - && !(unusable & gBitTable[i])) + && !(unusable & (1u << i))) { SetTypeBeforeUsingMove(moves[i], attacker); moveType = GetMoveType(moves[i]); if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, AI_DATA->abilities[target], FALSE) != 0) - usable |= gBitTable[i]; + usable |= 1u << i; } } @@ -1105,7 +1105,7 @@ bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & gBitTable[i]) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & (1u << i)) && AI_DATA->simulatedDmg[battlerDef][battlerAtk][i].expected >= gBattleMons[battlerAtk].hp) { return TRUE; @@ -1143,7 +1143,7 @@ u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & gBitTable[i]) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & (1u << i)) && bestDmg < AI_DATA->simulatedDmg[battlerAtk][battlerDef][i].expected) { bestDmg = AI_DATA->simulatedDmg[battlerAtk][battlerDef][i].expected; @@ -1164,7 +1164,7 @@ u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && !(unusable & gBitTable[i]) + && !(unusable & (1u << i)) && bestDmg < AI_DATA->simulatedDmg[battler][battlerTarget][i].expected) { bestDmg = AI_DATA->simulatedDmg[battler][battlerTarget][i].expected; @@ -1184,7 +1184,7 @@ bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(moveLimitations & gBitTable[i])) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(moveLimitations & (1u << i))) { // Use the pre-calculated value in simulatedDmg instead of re-calculating it dmg = AI_DATA->simulatedDmg[battlerAtk][battlerDef][i].expected; @@ -1229,7 +1229,7 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm if (dmgMod) dmg *= dmgMod; - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & gBitTable[i]) && dmg >= hpCheck) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !(unusable & (1u << i)) && dmg >= hpCheck) { return TRUE; } @@ -2091,7 +2091,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool if (moves[i] == MOVE_NONE || moves[i] == MOVE_UNAVAILABLE) continue; - if (!(gBitTable[i] & moveLimitations)) + if (!((1u << i) & moveLimitations)) { if (ignoreStatus && IS_MOVE_STATUS(moves[i])) continue; @@ -2117,7 +2117,7 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) { if (moves[i] == MOVE_NONE) break; - if (!(gBitTable[i] & moveLimitations)) + if (!((1u << i) & moveLimitations)) { if (gMovesInfo[moves[i]].effect == EFFECT_SLEEP && AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] < 85) diff --git a/src/battle_arena.c b/src/battle_arena.c index 26df519be0..f9a51ac652 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -386,9 +386,9 @@ void BattleArena_AddSkillPoints(u8 battler) if (gHitMarker & HITMARKER_OBEYS) { u8 *failedMoveBits = &gBattleStruct->alreadyStatusedMoveAttempt; - if (*failedMoveBits & gBitTable[battler]) + if (*failedMoveBits & (1u << battler)) { - *failedMoveBits &= ~(gBitTable[battler]); + *failedMoveBits &= ~((1u << battler)); skillPoints[battler] -= 2; } else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 0c71d0a1da..7aeefa54b6 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -118,7 +118,7 @@ void SetControllerToLinkOpponent(u32 battler) static void LinkOpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -376,7 +376,7 @@ static void LinkOpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index e5fb49bebf..283b492a91 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -117,7 +117,7 @@ void SetControllerToLinkPartner(u32 battler) static void LinkPartnerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -202,7 +202,7 @@ static void LinkPartnerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index b555711933..275aa623b6 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -132,7 +132,7 @@ void SetControllerToOpponent(u32 battler) static void OpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands)) sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -390,7 +390,7 @@ static void OpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } @@ -549,7 +549,7 @@ static void OpponentHandleChooseMove(u32 battler) if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } // If opponent can and should use a gimmick (considering trainer data), do it diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 8760252c67..61f2b8162d 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -180,13 +180,13 @@ static void PlayerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } static void PlayerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands)) sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -381,7 +381,7 @@ static void HandleInputChooseAction(u32 battler) { if (IsDoubleBattle() && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT - && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) + && !(gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { // Return item to bag if partner had selected one. @@ -507,7 +507,7 @@ void HandleInputChooseTarget(u32 battler) break; } - if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor] + if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move)) i = 0; } while (i == 0); @@ -557,7 +557,7 @@ void HandleInputChooseTarget(u32 battler) break; } - if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor] + if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move)) i = 0; } while (i == 0); @@ -753,7 +753,7 @@ void HandleInputChooseMove(u32 battler) if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) gMultiUsePlayerCursor = battler; - else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]) + else if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); @@ -994,10 +994,10 @@ void HandleMoveSwitching(u32 battler) moveInfo->maxPp[gMoveSelectionCursor[battler]] = moveInfo->maxPp[gMultiUsePlayerCursor]; moveInfo->maxPp[gMultiUsePlayerCursor] = i; - if (gDisableStructs[battler].mimickedMoves & gBitTable[gMoveSelectionCursor[battler]]) + if (gDisableStructs[battler].mimickedMoves & (1u << gMoveSelectionCursor[battler])) { - gDisableStructs[battler].mimickedMoves &= (~gBitTable[gMoveSelectionCursor[battler]]); - gDisableStructs[battler].mimickedMoves |= gBitTable[gMultiUsePlayerCursor]; + gDisableStructs[battler].mimickedMoves &= ~(1u << gMoveSelectionCursor[battler]); + gDisableStructs[battler].mimickedMoves |= 1u << gMultiUsePlayerCursor; } MoveSelectionDisplayMoveNames(battler); @@ -2109,7 +2109,7 @@ void PlayerHandleChooseMove(u32 battler) gBattleStruct->gimmick.playerSelect = FALSE; AssignUsableZMoves(battler, moveInfo->moves); - gBattleStruct->zmove.viable = (gBattleStruct->zmove.possibleZMoves[battler] & gBitTable[gMoveSelectionCursor[battler]]) != 0; + gBattleStruct->zmove.viable = (gBattleStruct->zmove.possibleZMoves[battler] & (1u << gMoveSelectionCursor[battler])) != 0; if (!IsGimmickTriggerSpriteActive()) gBattleStruct->gimmick.triggerSpriteId = 0xFF; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 2dffd4f702..47d71d87c6 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -121,7 +121,7 @@ void SetControllerToPlayerPartner(u32 battler) static void PlayerPartnerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -274,7 +274,7 @@ static void PlayerPartnerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } @@ -365,7 +365,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler) if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } // If partner can and should use a gimmick (considering trainer data), do it diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index abadcc231c..da977fab89 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -124,7 +124,7 @@ void SetControllerToRecordedOpponent(u32 battler) static void RecordedOpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -145,7 +145,7 @@ static void RecordedOpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 3a9ca1ec00..2bb64f3066 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -121,7 +121,7 @@ void SetControllerToRecordedPlayer(u32 battler) static void RecordedPlayerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -351,7 +351,7 @@ static void RecordedPlayerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 39fbc63ab6..b85157f246 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -112,7 +112,7 @@ void SetControllerToSafari(u32 battler) static void SafariBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands)) sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -240,7 +240,7 @@ static void SafariBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 7b0bb6f154..66d3932694 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -129,7 +129,7 @@ void SetControllerToWally(u32 battler) static void WallyBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands)) sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -288,7 +288,7 @@ static void WallyBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~gBitTable[battler]; + gBattleControllerExecFlags &= ~(1u << battler); } } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index e11406831b..9c9c1b50ba 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -851,7 +851,7 @@ void TryReceiveLinkBattleData(void) DestroyTask_RfuIdle(); for (i = 0; i < GetLinkPlayerCount(); i++) { - if (GetBlockReceivedStatus() & gBitTable[i]) + if (GetBlockReceivedStatus() & (1 << (i))) { ResetBlockReceivedFlag(i); recvBuffer = (u8 *)gBlockRecvBuffer[i]; @@ -898,7 +898,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0]) { case 0: - if (gBattleControllerExecFlags & gBitTable[battler]) + if (gBattleControllerExecFlags & (1u << battler)) return; memcpy(gBattleResources->bufferA[battler], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); @@ -917,7 +917,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) break; case 2: var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA]; - gBattleControllerExecFlags &= ~(gBitTable[battler] << (var * 4)); + gBattleControllerExecFlags &= ~(1u << (battler + var * 4)); break; } diff --git a/src/battle_dome.c b/src/battle_dome.c index 67b9a1e293..6069f5439c 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2030,8 +2030,8 @@ static void InitDomeTrainers(void) rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPDEF, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPEED, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_MAX_HP, NULL); - monTypesBits |= gBitTable[gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[0]]; - monTypesBits |= gBitTable[gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[1]]; + monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[0]; + monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[1]; } // Count the number of types in the players party, to factor into the ranking @@ -2062,8 +2062,8 @@ static void InitDomeTrainers(void) rankingScores[i] += statValues[STAT_SPDEF]; rankingScores[i] += statValues[STAT_SPEED]; rankingScores[i] += statValues[STAT_HP]; - monTypesBits |= gBitTable[gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]]; - monTypesBits |= gBitTable[gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]]; + monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; + monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; } for (monTypesCount = 0, j = 0; j < 32; j++) @@ -2344,9 +2344,9 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) while (i != DOME_BATTLE_PARTY_SIZE) { u32 rand = Random() & FRONTIER_PARTY_SIZE; - if (rand != FRONTIER_PARTY_SIZE && !(selectedMonBits & gBitTable[rand])) + if (rand != FRONTIER_PARTY_SIZE && !(selectedMonBits & (1u << rand))) { - selectedMonBits |= gBitTable[rand]; + selectedMonBits |= 1u << rand; i++; } } @@ -2376,7 +2376,7 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) for (i = 0; i < DOME_BATTLE_PARTY_SIZE; i++) { - selectedMonBits |= gBitTable[partyPositions[i]]; + selectedMonBits |= 1u << partyPositions[i]; } } @@ -5802,8 +5802,8 @@ static void InitRandomTourneyTreeResults(void) statSums[i] += statValues[STAT_SPDEF]; statSums[i] += statValues[STAT_SPEED]; statSums[i] += statValues[STAT_HP]; - monTypesBits |= gBitTable[gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]]; - monTypesBits |= gBitTable[gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]]; + monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; + monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; } // Because GF hates temporary vars, trainerId acts like monTypesCount here. diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index b396f1d7b5..22736b7c2b 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -126,7 +126,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) // If battler is < 50% HP and not asleep, use second set of move group likelihoods // otherwise use first set - i = (gBattleStruct->palaceFlags & gBitTable[battler]) ? 2 : 0; + i = (gBattleStruct->palaceFlags & (1u << battler)) ? 2 : 0; minGroupNum = i; maxGroupNum = i + 2; // + 2 because there are two percentages per set of likelihoods @@ -150,7 +150,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) if (moveInfo->moves[i] == MOVE_NONE) break; if (selectedGroup == GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) && moveInfo->currentPp[i] != 0) - selectedMoves |= gBitTable[i]; + selectedMoves |= 1u << i; } // Pass selected moves to AI, pick one @@ -178,11 +178,11 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) { // Count the number of usable moves the battler has in each move group. // The totals will be stored separately in 3 groups of 4 bits each in numMovesPerGroup. - if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_ATTACK && !(gBitTable[i] & unusableMovesBits)) + if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_ATTACK && !((1u << i) & unusableMovesBits)) numMovesPerGroup += (1 << 0); - if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_DEFENSE && !(gBitTable[i] & unusableMovesBits)) + if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_DEFENSE && !((1u << i) & unusableMovesBits)) numMovesPerGroup += (1 << 4); - if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_SUPPORT && !(gBitTable[i] & unusableMovesBits)) + if (GetBattlePalaceMoveGroup(battler, moveInfo->moves[i]) == PALACE_MOVE_GROUP_SUPPORT && !((1u << i) & unusableMovesBits)) numMovesPerGroup += (1 << 8); } @@ -215,7 +215,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) do { i = Random() % MAX_MON_MOVES; - if (!(gBitTable[i] & unusableMovesBits)) + if (!((1u << i) & unusableMovesBits)) chosenMoveId = i; } while (chosenMoveId == -1); } @@ -241,7 +241,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) do { i = Random() % MAX_MON_MOVES; - if (!(gBitTable[i] & unusableMovesBits) && randSelectGroup == GetBattlePalaceMoveGroup(battler, moveInfo->moves[i])) + if (!((1u << i) & unusableMovesBits) && randSelectGroup == GetBattlePalaceMoveGroup(battler, moveInfo->moves[i])) chosenMoveId = i; } while (chosenMoveId == -1); } diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 2595e4cbda..815fd5fc3e 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -45,7 +45,7 @@ bool32 IsGimmickSelected(u32 battler, enum Gimmick gimmick) { // There's no player select in tests, but some gimmicks need to test choice before they are fully activated. if (TESTING) - return (gBattleStruct->gimmick.toActivate & gBitTable[battler]) && gBattleStruct->gimmick.usableGimmick[battler] == gimmick; + return (gBattleStruct->gimmick.toActivate & (1u << battler)) && gBattleStruct->gimmick.usableGimmick[battler] == gimmick; else return gBattleStruct->gimmick.usableGimmick[battler] == gimmick && gBattleStruct->gimmick.playerSelect; } @@ -99,7 +99,7 @@ bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler) && (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] - || ((gBattleStruct->gimmick.toActivate & gBitTable[BATTLE_PARTNER(battler)] + || ((gBattleStruct->gimmick.toActivate & (1u << BATTLE_PARTNER(battler)) && gBattleStruct->gimmick.usableGimmick[BATTLE_PARTNER(battler)] == gimmick)))) { return TRUE; diff --git a/src/battle_interface.c b/src/battle_interface.c index 8d50bf95c3..4c17322b53 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1377,7 +1377,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, // fainted mon gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; } - else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostPlayerMons & gBitTable[j]) + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostPlayerMons & (1u << j)) { // fainted arena mon gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; @@ -1433,7 +1433,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, // fainted mon gSprites[ballIconSpritesIds[PARTY_SIZE - 1 - var]].oam.tileNum += 3; } - else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & gBitTable[j]) + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & (1u << j)) { // fainted arena mon gSprites[ballIconSpritesIds[PARTY_SIZE - 1 - var]].oam.tileNum += 3; @@ -2718,7 +2718,7 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); LoadSpritePalette(&sSpritePalette_AbilityPopUp); } - gBattleStruct->activeAbilityPopUps |= gBitTable[battlerId]; + gBattleStruct->activeAbilityPopUps |= 1u << battlerId; battlerPosition = GetBattlerPosition(battlerId); if (isDoubleBattle) @@ -2809,7 +2809,7 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) ||(sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) ) { - gBattleStruct->activeAbilityPopUps &= ~(gBitTable[sprite->tBattlerId]); + gBattleStruct->activeAbilityPopUps &= ~(1u << sprite->tBattlerId); DestroySprite(sprite); } } @@ -2823,7 +2823,7 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) void DestroyAbilityPopUp(u8 battlerId) { - if (gBattleStruct->activeAbilityPopUps & gBitTable[battlerId]) + if (gBattleStruct->activeAbilityPopUps & (1u << battlerId)) { gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][0]].tFrames = 0; gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][1]].tFrames = 0; diff --git a/src/battle_main.c b/src/battle_main.c index b46feaf0f9..25cee6dfa9 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3218,9 +3218,9 @@ void SwitchInClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[battler][1] = 0; gBattleStruct->lastTakenMoveFrom[battler][2] = 0; gBattleStruct->lastTakenMoveFrom[battler][3] = 0; - gBattleStruct->lastMoveFailed &= ~(gBitTable[battler]); - gBattleStruct->palaceFlags &= ~(gBitTable[battler]); - gBattleStruct->boosterEnergyActivates &= ~(gBitTable[battler]); + gBattleStruct->lastMoveFailed &= ~(1u << battler); + gBattleStruct->palaceFlags &= ~(1u << battler); + gBattleStruct->boosterEnergyActivates &= ~(1u << battler); for (i = 0; i < ARRAY_COUNT(gSideTimers); i++) { @@ -3245,7 +3245,7 @@ void SwitchInClearSetData(u32 battler) // Reset damage to prevent things like red card activating if the switched-in mon is holding it gSpecialStatuses[battler].physicalDmg = 0; gSpecialStatuses[battler].specialDmg = 0; - gBattleStruct->enduredDamage &= ~gBitTable[battler]; + gBattleStruct->enduredDamage &= ~(1u << battler); // Reset G-Max Chi Strike boosts. gBattleStruct->bonusCritStages[battler] = 0; @@ -3348,8 +3348,8 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[battler][2] = 0; gBattleStruct->lastTakenMoveFrom[battler][3] = 0; - gBattleStruct->palaceFlags &= ~(gBitTable[battler]); - gBattleStruct->boosterEnergyActivates &= ~(gBitTable[battler]); + gBattleStruct->palaceFlags &= ~(1u << battler); + gBattleStruct->boosterEnergyActivates &= ~(1u << battler); for (i = 0; i < ARRAY_COUNT(gSideTimers); i++) { @@ -3790,7 +3790,7 @@ static void TryDoEventsBeforeFirstTurn(void) struct Pokemon *party = GetBattlerParty(i); struct Pokemon *mon = &party[gBattlerPartyIndexes[i]]; if (!IsBattlerAlive(i) || gBattleMons[i].species == SPECIES_NONE || GetMonData(mon, MON_DATA_IS_EGG)) - gAbsentBattlerFlags |= gBitTable[i]; + gAbsentBattlerFlags |= 1u << i; } } @@ -3923,7 +3923,7 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleMons[i].status2 &= ~STATUS2_FLINCHED; // Record party slots of player's mons that appeared in battle if (!BattlerHasAi(i)) - gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[i]]; + gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; } *(&gBattleStruct->turnEffectsTracker) = 0; @@ -4195,10 +4195,10 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->monToSwitchIntoId + battler) = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI || (position & BIT_FLANK) == B_FLANK_LEFT - || gBattleStruct->absentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))] + || gBattleStruct->absentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(position))) || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { - if (gBattleStruct->absentBattlerFlags & gBitTable[battler]) + if (gBattleStruct->absentBattlerFlags & (1u << battler)) { gChosenActionByBattler[battler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -4234,7 +4234,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12)))) { RecordedBattle_SetBattlerAction(battler, gBattleResources->bufferB[battler][1]); gChosenActionByBattler[battler] = gBattleResources->bufferB[battler][1]; @@ -4386,7 +4386,7 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 3); } - gBattleStruct->gimmick.toActivate &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(battler))]); + gBattleStruct->gimmick.toActivate &= ~((1u << BATTLE_PARTNER(GetBattlerPosition(battler)))); BtlController_EmitEndBounceEffect(battler, BUFFER_A); MarkBattlerForControllerExec(battler); return; @@ -4429,7 +4429,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CASE_CHOSEN: - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12)))) { switch (gChosenActionByBattler[battler]) { @@ -4480,7 +4480,7 @@ static void HandleTurnActionSelectionState(void) // Check to see if any gimmicks need to be prepared. if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) - gBattleStruct->gimmick.toActivate |= gBitTable[battler]; + gBattleStruct->gimmick.toActivate |= 1u << battler; // Max Move check if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) @@ -4559,11 +4559,11 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED_STANDBY: - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) + if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) - | (gBitTable[battler] << 4) - | (gBitTable[battler] << 8) - | (gBitTable[battler] << 12)))) + | (1u << (battler + 4)) + | (1u << (battler + 8)) + | (1u << (battler + 12))))) { if (AllAtActionConfirmed()) i = TRUE; @@ -4572,7 +4572,7 @@ static void HandleTurnActionSelectionState(void) if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !IsDoubleBattle()) || (position & BIT_FLANK) != B_FLANK_LEFT - || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])) + || (*(&gBattleStruct->absentBattlerFlags) & (1u << GetBattlerAtPosition(BATTLE_PARTNER(position))))) { BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_STOP_BOUNCE, i); } @@ -4585,7 +4585,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED: - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) { gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++; } @@ -4599,7 +4599,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = battler; gBattlescriptCurrInstr = gSelectionBattleScripts[battler]; - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -4607,7 +4607,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_SET_BEFORE_ACTION: - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) { gBattleCommunication[battler] = STATE_BEFORE_ACTION_CHOSEN; } @@ -4631,7 +4631,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = battler; gBattlescriptCurrInstr = gSelectionBattleScripts[battler]; - if (!(gBattleControllerExecFlags & ((gBitTable[battler]) | (0xF << 28) | (gBitTable[battler] << 4) | (gBitTable[battler] << 8) | (gBitTable[battler] << 12)))) + if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -5154,10 +5154,10 @@ static bool32 TryDoGimmicksBeforeMoves(void) for (i = 0; i < gBattlersCount; i++) { // Search through each battler and activate their gimmick if they have one prepared. - if ((gBattleStruct->gimmick.toActivate & gBitTable[order[i]]) && !(gProtectStructs[order[i]].noValidMoves)) + if ((gBattleStruct->gimmick.toActivate & (1u << order[i])) && !(gProtectStructs[order[i]].noValidMoves)) { battler = gBattlerAttacker = gBattleScripting.battler = order[i]; - gBattleStruct->gimmick.toActivate &= ~(gBitTable[battler]); + gBattleStruct->gimmick.toActivate &= ~(1u << battler); if (gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick != NULL) { gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick(battler); @@ -5183,12 +5183,12 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) SortBattlersBySpeed(battlers, FALSE); for (i = 0; i < gBattlersCount; i++) { - if (!(gBattleStruct->focusPunchBattlers & gBitTable[battlers[i]]) + if (!(gBattleStruct->focusPunchBattlers & (1u << battlers[i])) && !(gBattleMons[battlers[i]].status1 & STATUS1_SLEEP) && !(gDisableStructs[battlers[i]].truantCounter) && !(gProtectStructs[battlers[i]].noValidMoves)) { - gBattleStruct->focusPunchBattlers |= gBitTable[battlers[i]]; + gBattleStruct->focusPunchBattlers |= 1u << battlers[i]; gBattlerAttacker = battlers[i]; switch (gChosenMoveByBattler[gBattlerAttacker]) { @@ -5560,7 +5560,7 @@ static void HandleEndTurn_FinishBattle(void) bool8 changedForm = FALSE; // Appeared in battle and didn't faint - if ((gBattleStruct->appearedInBattle & gBitTable[i]) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) + if ((gBattleStruct->appearedInBattle & (1u << i)) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_TERRAIN); if (!changedForm) @@ -5635,15 +5635,15 @@ static void TryEvolvePokemon(void) for (i = 0; i < PARTY_SIZE; i++) { - if (!(sTriedEvolving & gBitTable[i])) + if (!(sTriedEvolving & (1u << i))) { u16 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL); bool32 evoModeNormal = TRUE; - sTriedEvolving |= gBitTable[i]; + sTriedEvolving |= 1u << i; - if (species == SPECIES_NONE && (gLeveledUpInBattle & gBitTable[i])) + if (species == SPECIES_NONE && (gLeveledUpInBattle & (1u << i))) { - gLeveledUpInBattle &= ~(gBitTable[i]); + gLeveledUpInBattle &= ~(1u << i); species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_ONLY, gLeveledUpInBattle, NULL); } diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index ce7a0526f2..aa3c63ef82 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1081,7 +1081,7 @@ static void ShowPostBattleHintText(void) textIndex = sPyramidFloorTemplates[id].numTrainers; for (i = 0; i < MAX_PYRAMID_TRAINERS; i++) { - if (gBitTable[i] & gSaveBlock2Ptr->frontier.pyramidTrainerFlags) + if ((1u << i) & gSaveBlock2Ptr->frontier.pyramidTrainerFlags) textIndex--; } i = 1; @@ -1317,7 +1317,7 @@ u16 LocalIdToPyramidTrainerId(u8 localId) bool8 GetBattlePyramidTrainerFlag(u8 eventId) { - return gSaveBlock2Ptr->frontier.pyramidTrainerFlags & gBitTable[gObjectEvents[eventId].localId - 1]; + return gSaveBlock2Ptr->frontier.pyramidTrainerFlags & ((1u << gObjectEvents[eventId].localId) - 1); } void MarkApproachingPyramidTrainersAsBattled(void) @@ -1337,7 +1337,7 @@ static void MarkPyramidTrainerAsBattled(u16 trainerId) for (i = 0; i < MAX_PYRAMID_TRAINERS; i++) { if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId) - gSaveBlock2Ptr->frontier.pyramidTrainerFlags |= gBitTable[i]; + gSaveBlock2Ptr->frontier.pyramidTrainerFlags |= 1u << i; } gObjectEvents[gSelectedObjectEvent].movementType = MOVEMENT_TYPE_WANDER_AROUND; @@ -1893,12 +1893,12 @@ static void SetPyramidObjectPositionsUniformly(u8 objType) { if (bits & 1) { - if (!(gBitTable[squareId] & gSaveBlock2Ptr->frontier.pyramidRandoms[3])) + if (!((1u << squareId) & gSaveBlock2Ptr->frontier.pyramidRandoms[3])) bits |= 2; } else { - if (gBitTable[squareId] & gSaveBlock2Ptr->frontier.pyramidRandoms[3]) + if ((1u << squareId) & gSaveBlock2Ptr->frontier.pyramidRandoms[3]) bits |= 2; } if (++squareId >= NUM_PYRAMID_FLOOR_SQUARES) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 44ad1868a8..2553794caa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1173,7 +1173,7 @@ bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef) { - if (!(gBattleStruct->distortedTypeMatchups & gBitTable[battlerDef]) + if (!(gBattleStruct->distortedTypeMatchups & (1u << battlerDef)) && GetBattlerAbility(battlerDef) == ABILITY_TERA_SHELL && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL && !IS_MOVE_STATUS(move) @@ -1242,7 +1242,7 @@ static void Cmd_attackcanceler(void) if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) - && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE) { gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_1ST_HIT; @@ -1847,7 +1847,7 @@ static void Cmd_ppreduce(void) if (ShouldTeraShellDistortTypeMatchups(gCurrentMove, gBattlerTarget)) { - gBattleStruct->distortedTypeMatchups |= gBitTable[gBattlerTarget]; + gBattleStruct->distortedTypeMatchups |= 1u << gBattlerTarget; gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; @@ -1987,7 +1987,7 @@ static void Cmd_adjustdamage(void) goto END; if (DoesDisguiseBlockMove(gBattlerTarget, gCurrentMove)) { - gBattleStruct->enduredDamage |= gBitTable[gBattlerTarget]; + gBattleStruct->enduredDamage |= 1u << gBattlerTarget; goto END; } if (GetBattlerAbility(gBattlerTarget) == ABILITY_ICE_FACE && IS_MOVE_PHYSICAL(gCurrentMove) && gBattleMons[gBattlerTarget].species == SPECIES_EISCUE) @@ -2041,7 +2041,7 @@ static void Cmd_adjustdamage(void) // Handle reducing the dmg to 1 hp. gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - gBattleStruct->enduredDamage |= gBitTable[gBattlerTarget]; + gBattleStruct->enduredDamage |= 1u << gBattlerTarget; if (gProtectStructs[gBattlerTarget].endured) { @@ -2069,7 +2069,7 @@ END: gBattlescriptCurrInstr = cmd->nextInstr; if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMoveDamage >= 1) - gSpecialStatuses[gBattlerAttacker].damagedMons |= gBitTable[gBattlerTarget]; + gSpecialStatuses[gBattlerAttacker].damagedMons |= (1 << (gBattlerTarget)); // Check gems and damage reducing berries. if (gSpecialStatuses[gBattlerTarget].berryReduced @@ -2144,7 +2144,7 @@ static void Cmd_multihitresultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]]; + gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; @@ -2605,7 +2605,7 @@ static void Cmd_resultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]]; + gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; @@ -3530,7 +3530,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) { bool32 byTwo = FALSE; - gBattleStruct->stolenStats[0] |= gBitTable[i]; + gBattleStruct->stolenStats[0] |= (1 << (i)); // Store by how many stages to raise the stat. gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) @@ -3945,7 +3945,7 @@ static void Cmd_tryfaintmon(void) destinyBondBattler = gBattlerAttacker; faintScript = BattleScript_FaintTarget; } - if (!(gAbsentBattlerFlags & gBitTable[battler]) + if (!(gAbsentBattlerFlags & (1u << battler)) && !IsBattlerAlive(battler)) { gHitMarker |= HITMARKER_FAINTED(battler); @@ -4243,7 +4243,7 @@ static void Cmd_getexp(void) else { gBattleScripting.getexpState++; - gBattleStruct->givenExpMons |= gBitTable[gBattlerPartyIndexes[gBattlerFainted]]; + gBattleStruct->givenExpMons |= (1u << gBattlerPartyIndexes[gBattlerFainted]); } break; case 1: // calculate experience points to redistribute @@ -4260,25 +4260,25 @@ static void Cmd_getexp(void) { if (!IsValidForBattle(&gPlayerParty[i])) continue; - if (gBitTable[i] & sentInBits) + if ((1u << i) & sentInBits) viaSentIn++; holdEffect = GetMonHoldEffect(&gPlayerParty[i]); if (holdEffect == HOLD_EFFECT_EXP_SHARE || IsGen6ExpShareEnabled()) { - expShareBits |= gBitTable[i]; + expShareBits |= 1u << i; viaExpShare++; } } // Get order of mons getting exp: 1. all mons via sent in, 2. all mons via exp share for (i = 0; i < PARTY_SIZE; i++) { - if (gBitTable[i] & sentInBits) + if ((1u << i) & sentInBits) gBattleStruct->expGettersOrder[orderId++] = i; } for (i = 0; i < PARTY_SIZE; i++) { - if (!(gBitTable[i] & sentInBits) && gBitTable[i] & expShareBits) + if (!((1u << i) & sentInBits) && (1u << i) & expShareBits) gBattleStruct->expGettersOrder[orderId++] = i; } if (orderId < PARTY_SIZE) @@ -4330,7 +4330,7 @@ static void Cmd_getexp(void) case 2: // set exp value to the poke in expgetter_id and print message if (gBattleControllerExecFlags == 0) { - bool32 wasSentOut = ((gBattleStruct->expSentInMons & gBitTable[*expMonId]) != 0); + bool32 wasSentOut = (gBattleStruct->expSentInMons & (1u << *expMonId)) != 0; holdEffect = GetMonHoldEffect(&gPlayerParty[*expMonId]); if ((holdEffect != HOLD_EFFECT_EXP_SHARE && !wasSentOut && !IsGen6ExpShareEnabled()) @@ -4404,11 +4404,11 @@ static void Cmd_getexp(void) // get exp getter battler if (IsDoubleBattle()) { - if (gBattlerPartyIndexes[2] == *expMonId && !(gAbsentBattlerFlags & gBitTable[2])) + if (gBattlerPartyIndexes[2] == *expMonId && !(gAbsentBattlerFlags & 4)) gBattleStruct->expGetterBattlerId = 2; else { - if (!(gAbsentBattlerFlags & gBitTable[0])) + if (!(gAbsentBattlerFlags & 1)) gBattleStruct->expGetterBattlerId = 0; else gBattleStruct->expGetterBattlerId = 2; @@ -4474,7 +4474,7 @@ static void Cmd_getexp(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL)); BattleScriptPushCursor(); - gLeveledUpInBattle |= gBitTable[*expMonId]; + gLeveledUpInBattle |= 1 << *expMonId; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = T1_READ_32(&gBattleResources->bufferB[expBattler][2]); AdjustFriendship(&gPlayerParty[*expMonId], FRIENDSHIP_EVENT_GROW_LEVEL); @@ -4547,7 +4547,7 @@ bool32 NoAliveMonsForPlayer(void) for (i = 0; i < maxI; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) - && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i]))) + && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & (1u << i)))) { HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); } @@ -4565,7 +4565,7 @@ static bool32 NoAliveMonsForOpponent(void) 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->arenaLostOpponentMons & gBitTable[i]))) + && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostOpponentMons & (1u << i)))) { HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP); } @@ -5338,7 +5338,7 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef) } else { - gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[battlerDef]]; + gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[battlerDef]; } BattleScriptPushCursor(); @@ -5366,7 +5366,7 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) if (i != gBattlerAttacker && !(excludeCurrent && i == gBattlerTarget) && IsBattlerAlive(i) - && !(gBattleStruct->targetsDone[gBattlerAttacker] & gBitTable[i]) + && !(gBattleStruct->targetsDone[gBattlerAttacker] & (1u << i)) && (GetBattlerSide(i) != GetBattlerSide(gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) break; } @@ -5816,9 +5816,9 @@ static void Cmd_moveend(void) if ((gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) || (gBattleMons[gBattlerAttacker].status2 & (STATUS2_FLINCHED)) || gProtectStructs[gBattlerAttacker].prlzImmobility) - gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; + gBattleStruct->lastMoveFailed |= 1u << gBattlerAttacker; else - gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); + gBattleStruct->lastMoveFailed &= ~(1u << gBattlerAttacker); // Set ShellTrap to activate after the attacker's turn if target was hit by a physical move. if (gMovesInfo[gChosenMoveByBattler[gBattlerTarget]].effect == EFFECT_SHELL_TRAP @@ -5844,7 +5844,7 @@ static void Cmd_moveend(void) } if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) { - gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; + gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { @@ -5854,8 +5854,8 @@ static void Cmd_moveend(void) gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; } } - if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) - && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker]) + if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) + && !(gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker)) && gMovesInfo[originallyUsedMove].effect != EFFECT_BATON_PASS && gMovesInfo[originallyUsedMove].effect != EFFECT_HEALING_WISH) { @@ -5897,8 +5897,8 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_MIRROR_MOVE: // mirror move - if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) - && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker]) + if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) + && !(gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker)) && !gMovesInfo[originallyUsedMove].mirrorMoveBanned && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget @@ -5918,7 +5918,7 @@ static void Cmd_moveend(void) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) gProtectStructs[gBattlerAttacker].targetAffected = TRUE; - gBattleStruct->targetsDone[gBattlerAttacker] |= gBitTable[gBattlerTarget]; + gBattleStruct->targetsDone[gBattlerAttacker] |= 1u << gBattlerTarget; if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsDoubleBattle() && !gProtectStructs[gBattlerAttacker].chargingTurn @@ -5949,7 +5949,7 @@ static void Cmd_moveend(void) u8 originalBounceTarget = gBattlerAttacker; gBattleStruct->bouncedMoveIsUsed = FALSE; gBattlerAttacker = gBattleStruct->attackerBeforeBounce; - gBattleStruct->targetsDone[gBattlerAttacker] |= gBitTable[originalBounceTarget]; + gBattleStruct->targetsDone[gBattlerAttacker] |= 1u << originalBounceTarget; gBattleStruct->targetsDone[originalBounceTarget] = 0; nextTarget = GetNextTarget(moveTarget, FALSE); @@ -6052,7 +6052,7 @@ static void Cmd_moveend(void) && TARGET_TURN_DAMAGED && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate. - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]) + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) @@ -6076,9 +6076,9 @@ static void Cmd_moveend(void) u32 holdEffect; holdEffect = GetBattlerHoldEffect(i, TRUE); if (holdEffect == HOLD_EFFECT_EJECT_BUTTON) - ejectButtonBattlers |= gBitTable[i]; + ejectButtonBattlers |= 1u << i; else if (holdEffect == HOLD_EFFECT_EJECT_PACK) - ejectPackBattlers |= gBitTable[i]; + ejectPackBattlers |= 1u << i; } if (ejectButtonBattlers || ejectPackBattlers) { @@ -6089,7 +6089,7 @@ static void Cmd_moveend(void) { u32 battler = battlers[i]; - if (battler != gBattlerAttacker && ejectButtonBattlers & gBitTable[battler]) + if (battler != gBattlerAttacker && ejectButtonBattlers & (1u << battler)) { if (TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) // Apparently Sheer Force blocks Eject Button, but not Eject Pack continue; @@ -6098,7 +6098,7 @@ static void Cmd_moveend(void) if (!BATTLER_TURN_DAMAGED(battler)) continue; } - else if (ejectPackBattlers & gBitTable[battler]) + else if (ejectPackBattlers & (1u << battler)) { if (!gProtectStructs[battler].statFell || gProtectStructs[battler].disableEjectPack) continue; @@ -6120,7 +6120,7 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection effect = TRUE; BattleScriptPushCursor(); - if (ejectButtonBattlers & gBitTable[battler]) + if (ejectButtonBattlers & (1u << battler)) { gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; } @@ -6159,7 +6159,7 @@ static void Cmd_moveend(void) if (i == gBattlerAttacker) continue; if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_RED_CARD) - redCardBattlers |= gBitTable[i]; + redCardBattlers |= (1u << i); } if (redCardBattlers && (gMovesInfo[gCurrentMove].effect != EFFECT_HIT_SWITCH_TARGET || gBattleStruct->hitSwitchTargetFailed) @@ -6176,7 +6176,7 @@ static void Cmd_moveend(void) u32 battler = battlers[i]; // Search for fastest hit pokemon with a red card // Attacker is the one to be switched out, battler is one with red card - if (redCardBattlers & gBitTable[battler] + if (redCardBattlers & (1u << battler) && IsBattlerAlive(battler) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && BATTLER_TURN_DAMAGED(battler) @@ -6207,7 +6207,7 @@ static void Cmd_moveend(void) case MOVEEND_PICKPOCKET: if (IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]) // But not knocked off + && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) // Pickpocket doesn't activate for sheer force && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) // Pickpocket requires contact && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked @@ -6451,7 +6451,7 @@ static void Cmd_getswitchedmondata(void) gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler]; - BtlController_EmitGetMonData(battler, BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[battler]]); + BtlController_EmitGetMonData(battler, BUFFER_A, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -6497,7 +6497,7 @@ static void Cmd_switchindataupdate(void) if (i != PARTY_SIZE) { gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler] = i; - BtlController_EmitGetMonData(battler, BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[battler]]); + BtlController_EmitGetMonData(battler, BUFFER_A, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); MarkBattlerForControllerExec(battler); return; } @@ -6520,7 +6520,7 @@ static void Cmd_switchindataupdate(void) // check knocked off item i = GetBattlerSide(battler); - if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[battler]]) + if (gWishFutureKnock.knockedOffMons[i] & (1u << gBattlerPartyIndexes[battler])) { gBattleMons[battler].item = ITEM_NONE; } @@ -6541,7 +6541,7 @@ static void Cmd_switchindataupdate(void) && IsBattlerAlive(battler) && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) { - gBattleStruct->palaceFlags |= gBitTable[battler]; + gBattleStruct->palaceFlags |= 1u << battler; } gBattleScripting.battler = battler; @@ -6570,7 +6570,7 @@ static void Cmd_switchinanim(void) | BATTLE_TYPE_FRONTIER))) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); - gAbsentBattlerFlags &= ~(gBitTable[battler]); + gAbsentBattlerFlags &= ~(1u << battler); BtlController_EmitSwitchInAnim(battler, BUFFER_A, gBattlerPartyIndexes[battler], cmd->dontClearSubstitute); MarkBattlerForControllerExec(battler); @@ -6749,7 +6749,7 @@ static void ChooseMonToSendOut(u32 battler, u8 slotId) { gBattleStruct->battlerPartyIndexes[battler] = gBattlerPartyIndexes[battler]; gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; - gBattleStruct->field_93 &= ~(gBitTable[battler]); + gBattleStruct->field_93 &= ~(1u << battler); BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); @@ -6774,7 +6774,7 @@ static void Cmd_openpartyscreen(void) { if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(battler); @@ -6798,12 +6798,12 @@ static void Cmd_openpartyscreen(void) hitmarkerFaintBits = gHitMarker >> 28; - if (gBitTable[0] & hitmarkerFaintBits) + if (1u & hitmarkerFaintBits) { battler = 0; if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6820,12 +6820,12 @@ static void Cmd_openpartyscreen(void) flags |= 1; } } - if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits)) + if (4u & hitmarkerFaintBits && !(1u & hitmarkerFaintBits)) { battler = 2; if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6841,12 +6841,12 @@ static void Cmd_openpartyscreen(void) MarkBattlerForControllerExec(battler); } } - if (gBitTable[1] & hitmarkerFaintBits) + if (2 & hitmarkerFaintBits) { battler = 1; if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6863,12 +6863,12 @@ static void Cmd_openpartyscreen(void) flags |= 2; } } - if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits)) + if (8 & hitmarkerFaintBits && !(2 & hitmarkerFaintBits)) { battler = 3; if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6891,7 +6891,7 @@ static void Cmd_openpartyscreen(void) hasReplacement_2 = gSpecialStatuses[2].faintedHasReplacement; if (!hasReplacement_2 && hitmarkerFaintBits != 0) { - if (gAbsentBattlerFlags & gBitTable[0]) + if (gAbsentBattlerFlags & 1) battler = 2; else battler = 0; @@ -6907,7 +6907,7 @@ static void Cmd_openpartyscreen(void) hasReplacement_3 = gSpecialStatuses[3].faintedHasReplacement; if (!hasReplacement_3 && hitmarkerFaintBits != 0) { - if (gAbsentBattlerFlags & gBitTable[1]) + if (gAbsentBattlerFlags & 2) battler = 3; else battler = 1; @@ -6926,12 +6926,12 @@ static void Cmd_openpartyscreen(void) if (IsDoubleBattle()) { hitmarkerFaintBits = gHitMarker >> 28; - if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) + if (4 & hitmarkerFaintBits && 1 & hitmarkerFaintBits) { battler = 2; if (HasNoMonsToSwitch(battler, gBattleResources->bufferB[0][1], PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6942,12 +6942,12 @@ static void Cmd_openpartyscreen(void) gSpecialStatuses[battler].faintedHasReplacement = TRUE; } } - if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) + if (8u & hitmarkerFaintBits && hitmarkerFaintBits & 2u) { battler = 3; if (HasNoMonsToSwitch(battler, gBattleResources->bufferB[1][1], PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); BtlController_EmitCantSwitch(battler, BUFFER_A); MarkBattlerForControllerExec(battler); @@ -6975,7 +6975,7 @@ static void Cmd_openpartyscreen(void) hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted = 0; - while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits) + while (!((1u << gBattlerFainted) & hitmarkerFaintBits) && gBattlerFainted < gBattlersCount) gBattlerFainted++; @@ -6996,7 +6996,7 @@ static void Cmd_openpartyscreen(void) } else if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker &= ~HITMARKER_FAINTED(battler); gBattlescriptCurrInstr = failInstr; } @@ -7004,7 +7004,7 @@ static void Cmd_openpartyscreen(void) { *(gBattleStruct->battlerPartyIndexes + battler) = gBattlerPartyIndexes[battler]; *(gBattleStruct->monToSwitchIntoId + battler) = PARTY_SIZE; - gBattleStruct->field_93 &= ~(gBitTable[battler]); + gBattleStruct->field_93 &= ~(1u << battler); BtlController_EmitChoosePokemon(battler, BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(battler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); @@ -7028,7 +7028,7 @@ static void Cmd_openpartyscreen(void) else { u32 battlerOpposite = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); - if (gAbsentBattlerFlags & gBitTable[battlerOpposite]) + if (gAbsentBattlerFlags & (1u << battlerOpposite)) battlerOpposite ^= BIT_FLANK; // Make sure we're checking a valid battler. In edge case scenarios - battler could be absent and battlerOpposite would become a non-existent one softlocking the game. @@ -7060,10 +7060,10 @@ static void Cmd_switchhandleorder(void) if (gBattleResources->bufferB[i][0] == CONTROLLER_CHOSENMONRETURNVALUE) { *(gBattleStruct->monToSwitchIntoId + i) = gBattleResources->bufferB[i][1]; - if (!(gBattleStruct->field_93 & gBitTable[i])) + if (!(gBattleStruct->field_93 & (1u << i))) { RecordedBattle_SetBattlerAction(i, gBattleResources->bufferB[i][1]); - gBattleStruct->field_93 |= gBitTable[i]; + gBattleStruct->field_93 |= 1u << i; } } } @@ -7073,10 +7073,10 @@ static void Cmd_switchhandleorder(void) SwitchPartyOrder(battler); break; case 2: - if (!(gBattleStruct->field_93 & gBitTable[battler])) + if (!(gBattleStruct->field_93 & (1u << battler))) { RecordedBattle_SetBattlerAction(battler, gBattleResources->bufferB[battler][1]); - gBattleStruct->field_93 |= gBitTable[battler]; + gBattleStruct->field_93 |= 1u << battler; } // fall through case 3: @@ -7144,7 +7144,7 @@ static void UpdateSentMonFlags(u32 battler) gSpecialStatuses[battler].faintedHasReplacement = FALSE; if (!BattlerHasAi(battler)) - gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[battler]; } static bool32 DoSwitchInEffectsForBattler(u32 battler) @@ -7161,20 +7161,20 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } // Healing Wish activates before hazards. // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. - else if (((gBattleStruct->storedHealingWish & gBitTable[battler]) || (gBattleStruct->storedLunarDance & gBitTable[battler])) + else if (((gBattleStruct->storedHealingWish & (1u << battler)) || (gBattleStruct->storedLunarDance & (1u << battler))) && (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || B_HEALING_WISH_SWITCH < GEN_8)) { - if (gBattleStruct->storedHealingWish & gBitTable[battler]) + if (gBattleStruct->storedHealingWish & (1u << battler)) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HealingWishActivates; - gBattleStruct->storedHealingWish &= ~(gBitTable[battler]); + gBattleStruct->storedHealingWish &= ~(1u << battler); } else // Lunar Dance { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LunarDanceActivates; - gBattleStruct->storedLunarDance &= ~(gBitTable[battler]); + gBattleStruct->storedLunarDance &= ~(1u << battler); } } else if (!(gDisableStructs[battler].spikesDone) @@ -7308,7 +7308,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } - gBattleStruct->forcedSwitch &= ~(gBitTable[battler]); + gBattleStruct->forcedSwitch &= ~(1u << battler); return FALSE; } @@ -7324,7 +7324,7 @@ static void Cmd_switchineffects(void) { // Multiple mons fainted and are being switched-in. Their abilities/hazards will play according to speed ties. case BS_FAINTED_MULTIPLE_1: // Saves the battlers. - gBattleStruct->multipleSwitchInBattlers |= gBitTable[battler]; + gBattleStruct->multipleSwitchInBattlers |= 1 << battler; UpdateSentMonFlags(battler); // Increment fainted battler. @@ -7333,7 +7333,7 @@ static void Cmd_switchineffects(void) gBattlerFainted++; if (gBattlerFainted >= gBattlersCount) break; - if (gHitMarker & HITMARKER_FAINTED(gBattlerFainted) && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted])) + if (gHitMarker & HITMARKER_FAINTED(gBattlerFainted) && !(gAbsentBattlerFlags & (1u << gBattlerFainted))) break; } while (1); @@ -7353,7 +7353,7 @@ static void Cmd_switchineffects(void) for (; gBattleStruct->multipleSwitchInCursor < gBattlersCount; gBattleStruct->multipleSwitchInCursor++) { gBattlerFainted = gBattleStruct->multipleSwitchInSortedBattlers[gBattleStruct->multipleSwitchInCursor]; - if (gBattleStruct->multipleSwitchInBattlers & gBitTable[gBattlerFainted]) + if (gBattleStruct->multipleSwitchInBattlers & (1 << (gBattlerFainted))) { if (DoSwitchInEffectsForBattler(gBattlerFainted)) return; @@ -7982,7 +7982,7 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) if (ItemId_GetPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) - && gBattleStruct->ateBerry[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]] + && gBattleStruct->ateBerry[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler]) && !BATTLER_MAX_HP(battler)) { gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 3; @@ -8515,7 +8515,7 @@ bool32 CanUseLastResort(u8 battler) { if (gBattleMons[battler].moves[i] != MOVE_NONE) knownMovesCount++; - if (i != gCurrMovePos && gDisableStructs[battler].usedMoves & gBitTable[i]) // Increment used move count for all moves except current Last Resort. + if (i != gCurrMovePos && gDisableStructs[battler].usedMoves & (1u << i)) // Increment used move count for all moves except current Last Resort. usedMovesCount++; } @@ -8847,7 +8847,7 @@ static void HandleScriptMegaPrimalBurst(u32 caseId, u32 battler, u32 type) PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battler].species); - BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[battler]], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); + BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); MarkBattlerForControllerExec(battler); } // Update healthbox and elevation and play cry. @@ -9165,9 +9165,9 @@ static void Cmd_various(void) // Raise stats for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { - if (gBattleStruct->stolenStats[0] & gBitTable[i]) + if (gBattleStruct->stolenStats[0] & (1u << i)) { - gBattleStruct->stolenStats[0] &= ~(gBitTable[i]); + gBattleStruct->stolenStats[0] &= ~(1u << i); SET_STATCHANGER(i, gBattleStruct->stolenStats[i], FALSE); if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), i, MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) { @@ -9192,7 +9192,7 @@ static void Cmd_various(void) for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - bits |= gBitTable[i]; + bits |= 1u << i; } if (bits) { @@ -9200,7 +9200,7 @@ static void Cmd_various(void) do { statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; - } while (!(bits & gBitTable[statId])); + } while (!(bits & (1u << statId))); SET_STATCHANGER(statId, 2, FALSE); gBattlescriptCurrInstr = cmd->nextInstr; @@ -9300,12 +9300,12 @@ static void Cmd_various(void) // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") gBattleCommunication[0] = FALSE; // whether or not msg should be printed gBattleScripting.battler = battler = gBattleCommunication[1]; - if (!(gBattleStruct->palaceFlags & gBitTable[battler]) + if (!(gBattleStruct->palaceFlags & (1u << battler)) && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp && IsBattlerAlive(battler) && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) { - gBattleStruct->palaceFlags |= gBitTable[battler]; + gBattleStruct->palaceFlags |= 1u << battler; gBattleCommunication[0] = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = gNaturesInfo[GetNatureFromPersonality(gBattleMons[battler].personality)].battlePalaceFlavorText; } @@ -9330,7 +9330,7 @@ static void Cmd_various(void) VARIOUS_ARGS(); gBattleMons[1].hp = 0; gHitMarker |= HITMARKER_FAINTED(1); - gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]]; + gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; gDisableStructs[1].truantSwitchInHack = 1; break; } @@ -9340,7 +9340,7 @@ static void Cmd_various(void) gBattleMons[0].hp = 0; gHitMarker |= HITMARKER_FAINTED(0); gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]]; + gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; gDisableStructs[0].truantSwitchInHack = 1; break; } @@ -9352,8 +9352,8 @@ static void Cmd_various(void) gHitMarker |= HITMARKER_FAINTED(0); gHitMarker |= HITMARKER_FAINTED(1); gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]]; - gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]]; + gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; + gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; gDisableStructs[0].truantSwitchInHack = 1; gDisableStructs[1].truantSwitchInHack = 1; break; @@ -9438,7 +9438,7 @@ static void Cmd_various(void) case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT: { VARIOUS_ARGS(); - gBattleStruct->alreadyStatusedMoveAttempt |= gBitTable[battler]; + gBattleStruct->alreadyStatusedMoveAttempt |= 1u << battler; break; } case VARIOUS_PALACE_TRY_ESCAPE_STATUS: @@ -9455,7 +9455,7 @@ static void Cmd_various(void) // and its partner is still alive. if (GetBattlerSide(battler) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(battler))) { - gAbsentBattlerFlags |= gBitTable[battler]; + gAbsentBattlerFlags |= 1u << battler; gHitMarker |= HITMARKER_FAINTED(battler); gBattleMons[battler].hp = 0; SetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP, &gBattleMons[battler].hp); @@ -9830,7 +9830,7 @@ static void Cmd_various(void) if (!gBattleTextBuff1) PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battler].species); */ - BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[battler]], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); + BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); MarkBattlerForControllerExec(battler); } // Change stats. @@ -10034,7 +10034,7 @@ static void Cmd_various(void) || gBattleMons[gBattlerTarget].item != ITEM_NONE || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) - || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]) + || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -10279,7 +10279,7 @@ static void Cmd_various(void) ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) gBattleMons[battler].pp[i] -= ppToDeduct; - if (!(gDisableStructs[battler].mimickedMoves & gBitTable[i]) + if (!(gDisableStructs[battler].mimickedMoves & (1u << i)) && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[battler].pp[i]), &gBattleMons[battler].pp[i]); @@ -10518,9 +10518,9 @@ static void Cmd_various(void) if (gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_BATTLE_BOND && HasAttackerFaintedTarget() && CalculateBattlerPartyCount(gBattlerTarget) > 1 - && !(gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) + && !(gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker]))) { - gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] |= gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]; + gBattleStruct->battleBondTransformed[GetBattlerSide(gBattlerAttacker)] |= 1u << gBattlerPartyIndexes[gBattlerAttacker]; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species); gBattleStruct->changedSpecies[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = gBattleMons[gBattlerAttacker].species; gBattleMons[gBattlerAttacker].species = SPECIES_GRENINJA_ASH; @@ -10542,7 +10542,7 @@ static void Cmd_various(void) if (cmd->fromBattler) gLastUsedItem = gBattleMons[battler].item; - gBattleStruct->ateBerry[battler & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->ateBerry[battler & BIT_SIDE] |= 1u << gBattlerPartyIndexes[battler]; gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler, FALSE)) return; @@ -10882,9 +10882,9 @@ static void Cmd_various(void) { VARIOUS_ARGS(); if (gCurrentMove == MOVE_LUNAR_DANCE) - gBattleStruct->storedLunarDance |= gBitTable[battler]; + gBattleStruct->storedLunarDance |= 1u << battler; else - gBattleStruct->storedHealingWish |= gBitTable[battler]; + gBattleStruct->storedHealingWish |= 1u << battler; break; } case VARIOUS_HIT_SWITCH_TARGET_FAILED: @@ -10913,7 +10913,7 @@ static void Cmd_various(void) struct Pokemon *party = GetSideParty(side); u16 hp = GetMonData(&party[gSelectedMonPartyId], MON_DATA_MAX_HP) / 2; - BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_HP_BATTLE, gBitTable[gSelectedMonPartyId], sizeof(hp), &hp); + BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_HP_BATTLE, 1u << gSelectedMonPartyId, sizeof(hp), &hp); MarkBattlerForControllerExec(gBattlerAttacker); PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gSelectedMonPartyId], MON_DATA_SPECIES)); @@ -12136,7 +12136,7 @@ static void Cmd_forcerandomswitch(void) { *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; - gBattleStruct->forcedSwitch |= gBitTable[gBattlerTarget]; + gBattleStruct->forcedSwitch |= 1u << gBattlerTarget; *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; if (!IsMultiBattle()) @@ -12464,7 +12464,7 @@ static void Cmd_updatestatusicon(void) else { battler = gBattlerAttacker; - if (!(gAbsentBattlerFlags & gBitTable[battler])) + if (!(gAbsentBattlerFlags & (1u << battler))) { BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); MarkBattlerForControllerExec(battler); @@ -12472,7 +12472,7 @@ static void Cmd_updatestatusicon(void) if ((IsDoubleBattle())) { battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - if (!(gAbsentBattlerFlags & gBitTable[battler])) + if (!(gAbsentBattlerFlags & (1u << battler))) { BtlController_EmitStatusIconUpdate(battler, BUFFER_A, gBattleMons[battler].status1, gBattleMons[battler].status2); MarkBattlerForControllerExec(battler); @@ -12506,8 +12506,8 @@ static void Cmd_setfocusenergy(void) CMD_ARGS(u8 battler); u8 battler = GetBattlerForBattleScript(cmd->battler); - if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & gBitTable[battler]))) - || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) + || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; @@ -12650,7 +12650,7 @@ static void Cmd_mimicattackcopy(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos]; + gDisableStructs[gBattlerAttacker].mimickedMoves |= 1u << gCurrMovePos; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -12906,7 +12906,7 @@ static void Cmd_settypetorandomresistance(void) { case UQ_4_12(0): case UQ_4_12(0.5): - resistTypes |= gBitTable[i]; + resistTypes |= 1u << i; break; } } @@ -12914,11 +12914,11 @@ static void Cmd_settypetorandomresistance(void) while (resistTypes != 0) { i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & gBitTable[i]) + if (resistTypes & (1u << i)) { if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) { - resistTypes &= ~(gBitTable[i]); // Type resists, but the user is already of this type. + resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. } else { @@ -13008,7 +13008,7 @@ static void Cmd_trychoosesleeptalkmove(void) if (gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].sleepTalkBanned || gBattleMoveEffects[gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].effect].twoTurnEffect) { - unusableMovesBits |= gBitTable[i]; + unusableMovesBits |= (1 << (i)); } } @@ -13020,11 +13020,11 @@ static void Cmd_trychoosesleeptalkmove(void) else // at least one move can be chosen { // Set Sleep Talk as used move, so it works with Last Resort. - gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; + gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; do { movePosition = MOD(Random(), MAX_MON_MOVES); - } while ((gBitTable[movePosition] & unusableMovesBits)); + } while ((1u << movePosition) & unusableMovesBits); if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(gBattleMons[gBattlerAttacker].moves[movePosition])) { @@ -13135,7 +13135,7 @@ static void Cmd_tryspiteppreduce(void) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; // if (MOVE_IS_PERMANENT(gBattlerTarget, i)), but backwards - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & gBitTable[i]) + if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) { BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); @@ -13250,7 +13250,7 @@ static void Cmd_healpartystatus(void) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; if (IsDoubleBattle() - && !(gAbsentBattlerFlags & gBitTable[partner])) + && !(gAbsentBattlerFlags & (1u <failInstr; } @@ -14619,7 +14619,7 @@ static void Cmd_switchoutabilities(void) case ABILITY_NATURAL_CURE: gBattleMons[battler].status1 = 0; BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, - gBitTable[*(gBattleStruct->battlerPartyIndexes + battler)], + 1u << *(gBattleStruct->battlerPartyIndexes + battler), sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); @@ -14630,7 +14630,7 @@ static void Cmd_switchoutabilities(void) if (gBattleMoveDamage > gBattleMons[battler].maxHP) gBattleMoveDamage = gBattleMons[battler].maxHP; BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HP_BATTLE, - gBitTable[*(gBattleStruct->battlerPartyIndexes + battler)], + 1u << *(gBattleStruct->battlerPartyIndexes + battler), sizeof(gBattleMoveDamage), &gBattleMoveDamage); MarkBattlerForControllerExec(battler); @@ -14915,7 +14915,7 @@ static void Cmd_pursuitdoubles(void) u32 battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (IsDoubleBattle() - && !(gAbsentBattlerFlags & gBitTable[battler]) + && !(gAbsentBattlerFlags & (1u << battler)) && gChosenActionByBattler[battler] == B_ACTION_USE_MOVE && gMovesInfo[gChosenMoveByBattler[battler]].effect == EFFECT_PURSUIT) { @@ -16206,7 +16206,7 @@ void BS_ItemRestoreHP(void) // Revived battlers on the field need to be brought back. if (IsDoubleBattle() && battler != MAX_BATTLERS_COUNT) { - gAbsentBattlerFlags &= ~gBitTable[battler]; + gAbsentBattlerFlags &= ~(1u << battler); gBattleMons[battler].hp = hp; gBattleCommunication[MULTIUSE_STATE] = TRUE; } diff --git a/src/battle_terastal.c b/src/battle_terastal.c index f687150d39..2c140414db 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -114,14 +114,14 @@ u32 GetBattlerTeraType(u32 battler) void ExpendTypeStellarBoost(u32 battler, u32 type) { if (type < 32 && gBattleMons[battler].species != SPECIES_TERAPAGOS_STELLAR) // avoid OOB access - gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] |= gBitTable[type]; + gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] |= 1u << type; } // Checks whether a type's Stellar boost has been expended. bool32 IsTypeStellarBoosted(u32 battler, u32 type) { if (type < 32) // avoid OOB access - return !(gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] & gBitTable[type]); + return !(gBattleStruct->stellarBoostFlags[GetBattlerSide(battler)] & (1u << type)); else return FALSE; } diff --git a/src/battle_util.c b/src/battle_util.c index b16a33764b..7187c7cde8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -130,7 +130,7 @@ void HandleAction_UseMove(void) u16 moveTarget; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker] || !IsBattlerAlive(gBattlerAttacker)) + if (gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker) || !IsBattlerAlive(gBattlerAttacker)) { gCurrentActionFuncId = B_ACTION_FINISHED; return; @@ -322,7 +322,7 @@ void HandleAction_UseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget] + if (gAbsentBattlerFlags & (1u << gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); @@ -964,29 +964,29 @@ static void UNUSED MarkAllBattlersForControllerExec(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT); + gBattleControllerExecFlags |= 1u << (i + 32 - MAX_BATTLERS_COUNT); } else { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= gBitTable[i]; + gBattleControllerExecFlags |= 1 << i; } } bool32 IsBattlerMarkedForControllerExec(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return (gBattleControllerExecFlags & (gBitTable[battler] << 0x1C)) != 0; + return (gBattleControllerExecFlags & (1 << (battler + 28))) != 0; else - return (gBattleControllerExecFlags & (gBitTable[battler])) != 0; + return (gBattleControllerExecFlags & (1 << battler)) != 0; } void MarkBattlerForControllerExec(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= gBitTable[battler] << (32 - MAX_BATTLERS_COUNT); + gBattleControllerExecFlags |= 1u << (32 - MAX_BATTLERS_COUNT); else - gBattleControllerExecFlags |= gBitTable[battler]; + gBattleControllerExecFlags |= 1u << battler; } void MarkBattlerReceivedLinkData(u32 battler) @@ -994,9 +994,9 @@ void MarkBattlerReceivedLinkData(u32 battler) s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleControllerExecFlags |= gBitTable[battler] << (i << 2); + gBattleControllerExecFlags |= 1u << (battler + (i << 2)); - gBattleControllerExecFlags &= ~((1 << 28) << battler); + gBattleControllerExecFlags &= ~(1u << (28 + battler)); } const u8* CancelMultiTurnMoves(u32 battler) @@ -1172,7 +1172,7 @@ void ResetSentPokesToOpponentValue(void) gSentPokesToOpponent[1] = 0; for (i = 0; i < gBattlersCount; i += 2) - bits |= gBitTable[gBattlerPartyIndexes[i]]; + bits |= 1u << gBattlerPartyIndexes[i]; for (i = 1; i < gBattlersCount; i += 2) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits; @@ -1190,8 +1190,8 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler) for (i = 0; i < gBattlersCount; i += 2) { - if (!(gAbsentBattlerFlags & gBitTable[i])) - bits |= gBitTable[gBattlerPartyIndexes[i]]; + if (!(gAbsentBattlerFlags & (1u << i))) + bits |= 1u << gBattlerPartyIndexes[i]; } gSentPokesToOpponent[flank] = bits; } @@ -1207,7 +1207,7 @@ void UpdateSentPokesToOpponentValue(u32 battler) { s32 i; for (i = 1; i < gBattlersCount; i++) - gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[battler]]; + gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= 1u << gBattlerPartyIndexes[battler]; } } @@ -1248,7 +1248,7 @@ bool32 IsBelchPreventingMove(u32 battler, u32 move) if (gMovesInfo[move].effect != EFFECT_BELCH) return FALSE; - return !(gBattleStruct->ateBerry[battler & BIT_SIDE] & gBitTable[gBattlerPartyIndexes[battler]]); + return !(gBattleStruct->ateBerry[battler & BIT_SIDE] & (1u << gBattlerPartyIndexes[battler])); } // Dynamax bypasses all selection prevention except Taunt and Assault Vest. @@ -1513,55 +1513,55 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) moveEffect = gMovesInfo[move].effect; // No move if (check & MOVE_LIMITATION_ZEROMOVE && move == MOVE_NONE) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // No PP else if (check & MOVE_LIMITATION_PP && gBattleMons[battler].pp[i] == 0) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Placeholder else if (check & MOVE_LIMITATION_PLACEHOLDER && moveEffect == EFFECT_PLACEHOLDER) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Disable else if (check & MOVE_LIMITATION_DISABLED && move == gDisableStructs[battler].disabledMove) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Torment else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].status2 & STATUS2_TORMENT) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Taunt else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IS_MOVE_STATUS(move)) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Imprison else if (check & MOVE_LIMITATION_IMPRISON && GetImprisonedMovesCount(battler, move)) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Encore else if (check & MOVE_LIMITATION_ENCORE && gDisableStructs[battler].encoreTimer && gDisableStructs[battler].encoredMove != move) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Choice Items else if (check & MOVE_LIMITATION_CHOICE_ITEM && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Assault Vest else if (check & MOVE_LIMITATION_ASSAULT_VEST && holdEffect == HOLD_EFFECT_ASSAULT_VEST && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_ME_FIRST) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Gravity else if (check & MOVE_LIMITATION_GRAVITY && IsGravityPreventingMove(move)) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Heal Block else if (check & MOVE_LIMITATION_HEAL_BLOCK && IsHealBlockPreventingMove(battler, move)) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Belch else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move)) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Throat Chop else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer && gMovesInfo[move].soundMove) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Stuff Cheeks else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Gorilla Tactics else if (check & MOVE_LIMITATION_CHOICE_ITEM && GetBattlerAbility(battler) == ABILITY_GORILLA_TACTICS && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; // Can't Use Twice flag else if (check & MOVE_LIMITATION_CANT_USE_TWICE && gMovesInfo[move].cantUseTwice && move == gLastResultingMoves[battler]) - unusableMoves |= gBitTable[i]; + unusableMoves |= 1u << i; } return unusableMoves; } @@ -1703,10 +1703,10 @@ u8 DoFieldEndTurnEffects(void) { u8 effect = 0; - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++) + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & (1u << gBattlerAttacker); gBattlerAttacker++) { } - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; gBattlerTarget++) + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & (1u << gBattlerTarget); gBattlerTarget++) { } @@ -2370,7 +2370,7 @@ u8 DoBattlerEndTurnEffects(void) while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; - if (gAbsentBattlerFlags & gBitTable[battler]) + if (gAbsentBattlerFlags & (1u << battler)) { gBattleStruct->turnEffectsBattlerId++; continue; @@ -3032,7 +3032,7 @@ bool32 HandleWishPerishSongOnTurnEnd(void) if (gWishFutureKnock.futureSightCounter[battler] != 0 && --gWishFutureKnock.futureSightCounter[battler] == 0 - && !(gAbsentBattlerFlags & gBitTable[battler])) + && !(gAbsentBattlerFlags & (1u << battler))) { struct Pokemon *party; @@ -3073,7 +3073,7 @@ bool32 HandleWishPerishSongOnTurnEnd(void) while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) { battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId]; - if (gAbsentBattlerFlags & gBitTable[battler]) + if (gAbsentBattlerFlags & (1u << battler)) { gBattleStruct->wishPerishSongBattlerId++; continue; @@ -3139,8 +3139,8 @@ bool32 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState++; for (i = 0; i < gBattlersCount; i++) { - if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) - gAbsentBattlerFlags &= ~(gBitTable[i]); + if (gAbsentBattlerFlags & (1u << i) && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) + gAbsentBattlerFlags &= ~(1u << i); } // fall through case 1: @@ -3148,8 +3148,8 @@ bool32 HandleFaintedMonActions(void) { gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 - && !(gBattleStruct->givenExpMons & gBitTable[gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId]]) - && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId])) + && !(gBattleStruct->givenExpMons & (1u << gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId])) + && !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId))) { BattleScriptExecute(BattleScript_GiveExp); gBattleStruct->faintedActionsState = 2; @@ -3170,7 +3170,7 @@ bool32 HandleFaintedMonActions(void) && !NoAliveMonsForEitherParty() && gCurrentTurnActionNumber != gBattlersCount) { - gAbsentBattlerFlags |= gBitTable[gBattlerFainted]; + gAbsentBattlerFlags |= 1u << gBattlerFainted; if (gBattleStruct->faintedActionsState != 1) return FALSE; } @@ -3192,7 +3192,7 @@ bool32 HandleFaintedMonActions(void) { gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId; if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0 - && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId])) + && !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId))) { BattleScriptExecute(BattleScript_HandleFaintedMon); gBattleStruct->faintedActionsState = 5; @@ -3498,7 +3498,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) gCurrentMove = MOVE_BIDE; gBattleScripting.bideDmg = gBideDmg[gBattlerAttacker] * 2; gBattlerTarget = gBideTarget[gBattlerAttacker]; - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; } @@ -4731,11 +4731,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_SUPERSWEET_SYRUP: if (!gSpecialStatuses[battler].switchInAbilityDone - && !(gBattleStruct->supersweetSyrup[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]])) + && !(gBattleStruct->supersweetSyrup[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler]))) { gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->supersweetSyrup[GetBattlerSide(battler)] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->supersweetSyrup[GetBattlerSide(battler)] |= (1u << gBattlerPartyIndexes[battler]); BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates); effect++; } @@ -4772,12 +4772,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_INTREPID_SWORD: if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !(gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]])) + && !(gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler]))) { gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = battler; if (B_INTREPID_SWORD == GEN_9) - gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->intrepidSwordBoost[GetBattlerSide(battler)] |= 1u << gBattlerPartyIndexes[battler]; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4786,12 +4786,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_DAUNTLESS_SHIELD: if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN) - && !(gBattleStruct->dauntlessShieldBoost[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]])) + && !(gBattleStruct->dauntlessShieldBoost[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler]))) { gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = battler; if (B_DAUNTLESS_SHIELD == GEN_9) - gBattleStruct->dauntlessShieldBoost[GetBattlerSide(battler)] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->dauntlessShieldBoost[GetBattlerSide(battler)] |= 1u << gBattlerPartyIndexes[battler]; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_DEF, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4895,11 +4895,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO - && !(gBattleStruct->transformZeroToHero[side] & gBitTable[gBattlerPartyIndexes[battler]])) + && !(gBattleStruct->transformZeroToHero[side] & (1u << gBattlerPartyIndexes[battler]))) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattlerAttacker = battler; - gBattleStruct->transformZeroToHero[side] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->transformZeroToHero[side] |= 1u << gBattlerPartyIndexes[battler]; BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates); effect++; } @@ -5046,9 +5046,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 for (i = STAT_ATK; i < statsNum; i++) { if (CompareStat(battler, i, MIN_STAT_STAGE, CMP_GREATER_THAN)) - validToLower |= gBitTable[i]; + validToLower |= 1u << i; if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - validToRaise |= gBitTable[i]; + validToRaise |= 1u << i; } if (validToLower != 0 || validToRaise != 0) // Can lower one stat, or can raise one stat @@ -5059,16 +5059,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 do { i = (Random() % statsNum) + STAT_ATK; - } while (!(validToRaise & gBitTable[i])); + } while (!(validToRaise & (1u << i))); SET_STATCHANGER(i, 2, FALSE); - validToLower &= ~(gBitTable[i]); // Can't lower the same stat as raising. + validToLower &= ~(1u << 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])); + } while (!(validToLower & (1u << i))); SET_STATCHANGER2(gBattleScripting.savedStatChanger, i, 1, TRUE); } BattleScriptPushCursorAndCallback(BattleScript_MoodyActivates); @@ -7560,13 +7560,13 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) effect = TryConsumeMirrorHerb(battler, TRUE); break; case HOLD_EFFECT_BOOSTER_ENERGY: - if (!(gBattleStruct->boosterEnergyActivates & gBitTable[battler]) + if (!(gBattleStruct->boosterEnergyActivates & (1u << battler)) && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); gBattleScripting.battler = battler; - gBattleStruct->boosterEnergyActivates |= gBitTable[battler]; + gBattleStruct->boosterEnergyActivates |= 1u << battler; BattleScriptExecute(BattleScript_BoosterEnergyEnd2); effect = ITEM_EFFECT_OTHER; } @@ -7827,13 +7827,13 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) effect = TryConsumeMirrorHerb(battler, TRUE); break; case HOLD_EFFECT_BOOSTER_ENERGY: - if (!(gBattleStruct->boosterEnergyActivates & gBitTable[battler]) + if (!(gBattleStruct->boosterEnergyActivates & (1u << battler)) && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); gBattlerAbility = gBattleScripting.battler = battler; - gBattleStruct->boosterEnergyActivates |= gBitTable[battler]; + gBattleStruct->boosterEnergyActivates |= 1u << battler; BattleScriptExecute(BattleScript_BoosterEnergyEnd2); effect = ITEM_EFFECT_OTHER; } @@ -8210,7 +8210,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) // Berry was successfully used on a Pokemon. if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX)) - gBattleStruct->ateBerry[battler & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[battler]]; + gBattleStruct->ateBerry[battler & BIT_SIDE] |= 1u << gBattlerPartyIndexes[battler]; return effect; } @@ -8401,7 +8401,7 @@ u8 IsMonDisobedient(void) calc = (levelReferenced + obedienceLevel) * rnd >> 8; if (calc < obedienceLevel) { - calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL); + calc = CheckMoveLimitations(gBattlerAttacker, 1u << gCurrMovePos, MOVE_LIMITATIONS_ALL); if (calc == ALL_MOVES_MASK) // all moves cannot be used { // Randomly select, then print a disobedient string @@ -8415,7 +8415,7 @@ u8 IsMonDisobedient(void) do { gCurrMovePos = gChosenMovePos = MOD(Random(), MAX_MON_MOVES); - } while (gBitTable[gCurrMovePos] & calc); + } while ((1u << gCurrMovePos) & calc); gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; SetAtkCancellerForCalledMove(); @@ -8630,7 +8630,7 @@ bool32 IsBattlerAlive(u32 battler) return FALSE; else if (battler >= gBattlersCount) return FALSE; - else if (gAbsentBattlerFlags & gBitTable[battler]) + else if (gAbsentBattlerFlags & (1u << battler)) return FALSE; else return TRUE; @@ -8703,12 +8703,12 @@ u32 GetMoveTargetCount(u32 move, u32 battlerAtk, u32 battlerDef) switch (GetBattlerMoveTargetType(gBattlerAttacker, move)) { case MOVE_TARGET_BOTH: - return !(gAbsentBattlerFlags & gBitTable[battlerDef]) - + !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerDef)]); + return !(gAbsentBattlerFlags & (1u << battlerDef)) + + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerDef))); case MOVE_TARGET_FOES_AND_ALLY: - return !(gAbsentBattlerFlags & gBitTable[battlerDef]) - + !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerDef)]) - + !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerAtk)]); + return !(gAbsentBattlerFlags & (1u << battlerDef)) + + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerDef))) + + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerAtk))); case MOVE_TARGET_OPPONENTS_FIELD: return 1; case MOVE_TARGET_DEPENDS: @@ -9126,7 +9126,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_STOMPING_TANTRUM: - if (gBattleStruct->lastMoveFailed & gBitTable[battlerAtk]) + if (gBattleStruct->lastMoveFailed & (1u << battlerAtk)) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_MAGNITUDE: @@ -9281,7 +9281,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerAtk]) + if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } @@ -9289,7 +9289,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_QUARK_DRIVE: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerAtk]) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } @@ -9359,7 +9359,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerDef]) + if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } @@ -9367,7 +9367,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerDef]) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } @@ -10335,7 +10335,7 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move mod = UQ_4_12(1.0); } - if (gBattleStruct->distortedTypeMatchups & gBitTable[battlerDef] || (gBattleStruct->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) + if (gBattleStruct->distortedTypeMatchups & (1u << battlerDef) || (gBattleStruct->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) { mod = UQ_4_12(0.5); if (recordAbilities) @@ -11245,7 +11245,7 @@ bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_SECRET_BASE)) - && (gWishFutureKnock.knockedOffMons[stealerSide] & gBitTable[gBattlerPartyIndexes[battlerStealing]])) + && (gWishFutureKnock.knockedOffMons[stealerSide] & (1u << gBattlerPartyIndexes[battlerStealing]))) { return FALSE; } diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 8113da48a9..5a5816142c 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -209,13 +209,13 @@ void AssignUsableZMoves(u32 battler, u16 *moves) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && IsViableZMove(battler, moves[i])) - gBattleStruct->zmove.possibleZMoves[battler] |= gBitTable[i]; + gBattleStruct->zmove.possibleZMoves[battler] |= 1u << i; } } bool32 TryChangeZTrigger(u32 battler, u32 moveIndex) { - bool32 viableZMove = (gBattleStruct->zmove.possibleZMoves[battler] & gBitTable[moveIndex]) != 0; + bool32 viableZMove = (gBattleStruct->zmove.possibleZMoves[battler] & (1u << moveIndex)) != 0; if (gBattleStruct->zmove.viable && !viableZMove) HideGimmickTriggerSprite(); // Was a viable z move, now is not -> slide out diff --git a/src/pokemon.c b/src/pokemon.c index 306e310372..1acaa3a2ed 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2080,14 +2080,14 @@ u8 CountAliveMonsInBattle(u8 caseId, u32 battler) case BATTLE_ALIVE_EXCEPT_BATTLER: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (i != battler && !(gAbsentBattlerFlags & gBitTable[i])) + if (i != battler && !(gAbsentBattlerFlags & (1u << i))) retVal++; } break; case BATTLE_ALIVE_SIDE: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & gBitTable[i])) + if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & (1u << i))) retVal++; } break; @@ -2115,7 +2115,7 @@ u8 GetDefaultMoveTarget(u8 battlerId) } else { - if ((gAbsentBattlerFlags & gBitTable[opposing])) + if ((gAbsentBattlerFlags & (1u << opposing))) return GetBattlerAtPosition(BATTLE_PARTNER(opposing)); else return GetBattlerAtPosition(opposing); @@ -2691,7 +2691,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) || substruct1->move2 == move || substruct1->move3 == move || substruct1->move4 == move) - retVal |= gBitTable[i]; + retVal |= (1u << i); i++; } } @@ -5316,7 +5316,7 @@ void RandomlyGivePartyPokerus(struct Pokemon *party) } while (!GetMonData(mon, MON_DATA_SPECIES, 0) || GetMonData(mon, MON_DATA_IS_EGG, 0)); - if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) + if (!(CheckPartyHasHadPokerus(party, 1u << rnd))) { u8 rnd2; @@ -6651,9 +6651,9 @@ void TrySpecialOverworldEvo(void) for (i = 0; i < PARTY_SIZE; i++) { u16 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_OVERWORLD_SPECIAL, evoMethod, SPECIES_NONE); - if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & gBitTable[i])) + if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & (1u << i))) { - sTriedEvolving |= gBitTable[i]; + sTriedEvolving |= 1u << i; if(gMain.callback2 == TrySpecialOverworldEvo) // This fixes small graphics glitches. EvolutionScene(&gPlayerParty[i], targetSpecies, canStopEvo, i); else diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 2ac33a08a0..c32e86b525 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -741,7 +741,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) movePp.moves[j] = gBattleMons[battlerId].moves[moveSlots[j]]; movePp.currentPp[j] = gBattleMons[battlerId].pp[moveSlots[j]]; movePp.maxPp[j] = ppBonuses[moveSlots[j]]; - mimickedMoveSlots[j] = (gDisableStructs[battlerId].mimickedMoves & gBitTable[j]) >> j; + mimickedMoveSlots[j] = (gDisableStructs[battlerId].mimickedMoves & (1u << j)) >> j; } for (j = 0; j < MAX_MON_MOVES; j++) { diff --git a/src/script_movement.c b/src/script_movement.c index 10517dfc8e..d67afd9972 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -142,19 +142,19 @@ static void LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *obj static void ClearMovementScriptFinished(u8 taskId, u8 moveScrId) { - u16 mask = ~gBitTable[moveScrId]; + u16 mask = ~(1u << moveScrId); gTasks[taskId].data[0] &= mask; } static void SetMovementScriptFinished(u8 taskId, u8 moveScrId) { - gTasks[taskId].data[0] |= gBitTable[moveScrId]; + gTasks[taskId].data[0] |= (1u << moveScrId); } static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId) { - u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId]; + u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & (1u << moveScrId); if (moveScriptFinished != 0) return TRUE; diff --git a/src/trainer_hill.c b/src/trainer_hill.c index aa7c8ee930..c89803ffb2 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -852,7 +852,7 @@ bool8 GetHillTrainerFlag(u8 objectEventId) u32 trainerIndexStart = GetFloorId() * HILL_TRAINERS_PER_FLOOR; u8 bitId = gObjectEvents[objectEventId].localId - 1 + trainerIndexStart; - return gSaveBlock2Ptr->frontier.trainerFlags & gBitTable[bitId]; + return gSaveBlock2Ptr->frontier.trainerFlags & (1u << bitId); } void SetHillTrainerFlag(void) @@ -864,7 +864,7 @@ void SetHillTrainerFlag(void) { if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_A) { - gSaveBlock2Ptr->frontier.trainerFlags |= gBitTable[trainerIndexStart + i]; + gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; } } @@ -875,7 +875,7 @@ void SetHillTrainerFlag(void) { if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_B) { - gSaveBlock2Ptr->frontier.trainerFlags |= gBitTable[trainerIndexStart + i]; + gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; } } diff --git a/src/util.c b/src/util.c index 77d9cde2f1..002b2fabf0 100644 --- a/src/util.c +++ b/src/util.c @@ -4,42 +4,6 @@ #include "palette.h" #include "constants/rgb.h" -const u32 gBitTable[] = -{ - 1 << 0, - 1 << 1, - 1 << 2, - 1 << 3, - 1 << 4, - 1 << 5, - 1 << 6, - 1 << 7, - 1 << 8, - 1 << 9, - 1 << 10, - 1 << 11, - 1 << 12, - 1 << 13, - 1 << 14, - 1 << 15, - 1 << 16, - 1 << 17, - 1 << 18, - 1 << 19, - 1 << 20, - 1 << 21, - 1 << 22, - 1 << 23, - 1 << 24, - 1 << 25, - 1 << 26, - 1 << 27, - 1 << 28, - 1 << 29, - 1 << 30, - 1 << 31, -}; - static const struct SpriteTemplate sInvisibleSpriteTemplate = { .tileTag = 0, diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 92789710f7..53e63dc7cf 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -769,7 +769,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl u32 i, countExpected = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBitTable[i] & expectedAction->moveSlots) + if ((1u << i) & expectedAction->moveSlots) { if (printLog) PrintAiMoveLog(battlerId, i, gBattleMons[battlerId].moves[i], gBattleStruct->aiFinalScore[battlerId][expectedAction->target][i]); @@ -801,7 +801,7 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBitTable[i] & expectedAction->moveSlots) + if ((1u << i) & expectedAction->moveSlots) { expectedMoveId = gBattleMons[battlerId].moves[i]; if (!expectedAction->notMove) @@ -917,8 +917,8 @@ static void CheckIfMaxScoreEqualExpectMove(u32 battlerId, s32 target, struct Exp // We expect move 'i', but it has the same best score as another move that we didn't expect. if (scores[i] == scores[bestScoreId] && !aiAction->notMove - && (aiAction->moveSlots & gBitTable[i]) - && !(aiAction->moveSlots & gBitTable[bestScoreId])) + && (aiAction->moveSlots & (1u << i)) + && !(aiAction->moveSlots & (1u << bestScoreId))) { Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: EXPECT_MOVE %S has the same best score(%d) as not expected MOVE %S", filename, aiAction->sourceLine, GetMoveName(moves[i]), scores[i], GetMoveName(moves[bestScoreId])); @@ -926,8 +926,8 @@ static void CheckIfMaxScoreEqualExpectMove(u32 battlerId, s32 target, struct Exp // We DO NOT expect move 'i', but it has the same best score as another move. if (scores[i] == scores[bestScoreId] && aiAction->notMove - && (aiAction->moveSlots & gBitTable[i]) - && !(aiAction->moveSlots & gBitTable[bestScoreId])) + && (aiAction->moveSlots & (1u << i)) + && !(aiAction->moveSlots & (1u << bestScoreId))) { Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: NOT_EXPECT_MOVE %S has the same best score(%d) as MOVE %S", filename, aiAction->sourceLine, GetMoveName(moves[i]), scores[i], GetMoveName(moves[bestScoreId])); @@ -940,9 +940,9 @@ static void PrintAiMoveLog(u32 battlerId, u32 moveSlot, u32 moveId, s32 totalSco s32 i, scoreFromLogs = 0; if (!DATA.logAI) return; - if (DATA.aiLogPrintedForMove[battlerId] & gBitTable[moveSlot]) return; + if (DATA.aiLogPrintedForMove[battlerId] & (1u << moveSlot)) return; - DATA.aiLogPrintedForMove[battlerId] |= gBitTable[moveSlot]; + DATA.aiLogPrintedForMove[battlerId] |= 1u << moveSlot; Test_MgbaPrintf("Score Log for move %S:\n", GetMoveName(moveId)); for (i = 0; i < MAX_AI_LOG_LINES; i++) { @@ -2187,7 +2187,7 @@ static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, str id = DATA.expectedAiActionIndex[battlerId]; DATA.expectedAiActions[battlerId][id].type = B_ACTION_USE_MOVE; - DATA.expectedAiActions[battlerId][id].moveSlots |= gBitTable[moveSlot]; + DATA.expectedAiActions[battlerId][id].moveSlots |= 1 << moveSlot; DATA.expectedAiActions[battlerId][id].target = target; DATA.expectedAiActions[battlerId][id].explicitTarget = ctx->explicitTarget; DATA.expectedAiActions[battlerId][id].sourceLine = sourceLine; From 3a0c5c9c6cd284a7bbf6f6f49c558f7984098038 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 17 Aug 2024 18:18:03 +0200 Subject: [PATCH 108/225] Adds missing AI checks for poltergeist (#5189) Adds missing AI checks for poltergeist --- src/battle_ai_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 30bce86c3d..08e05e02c1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -483,7 +483,7 @@ bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef) return TRUE; break; case EFFECT_POLTERGEIST: - if (AI_DATA->items[battlerDef] == ITEM_NONE) + if (AI_DATA->items[battlerDef] == ITEM_NONE || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || battlerDefAbility == ABILITY_KLUTZ) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: From 8607a7fb338d81a3e5692d1aafd0951e7fd603c5 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 17 Aug 2024 18:19:22 +0200 Subject: [PATCH 109/225] Fixes UB in Cmd_averagestats (#5191) * Fixes UB in Cmd_averagestats * fix test and align default case --- src/battle_script_commands.c | 23 ++++++++++++++++------- test/battle/move_effect/guard_split.c | 22 ++++++++++++++++++++++ test/battle/move_effect/power_split.c | 22 ++++++++++++++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 test/battle/move_effect/guard_split.c create mode 100644 test/battle/move_effect/power_split.c diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 394a455b3a..9165d7b7e4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15669,17 +15669,26 @@ static void Cmd_swapstatstages(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static u16 *GetBattlerStat(struct BattlePokemon *battler, u32 stat) +{ + switch (stat) + { + case STAT_ATK: return &battler->attack; + case STAT_DEF: return &battler->defense; + case STAT_SPATK: return &battler->spAttack; + case STAT_SPDEF: return &battler->spDefense; + default: return NULL; + } +} + static void Cmd_averagestats(void) { CMD_ARGS(u8 stat); - u8 stat = cmd->stat; - u16 atkStat = *(u16 *)((&gBattleMons[gBattlerAttacker].attack) + (stat - 1)); - u16 defStat = *(u16 *)((&gBattleMons[gBattlerTarget].attack) + (stat - 1)); - u16 average = (atkStat + defStat) / 2; - - *(u16 *)((&gBattleMons[gBattlerAttacker].attack) + (stat - 1)) = average; - *(u16 *)((&gBattleMons[gBattlerTarget].attack) + (stat - 1)) = average; + u16 *stat1 = GetBattlerStat(&gBattleMons[gBattlerAttacker], cmd->stat); + u16 *stat2 = GetBattlerStat(&gBattleMons[gBattlerTarget], cmd->stat); + u16 avg = (*stat1 + *stat2) / 2; + *stat1 = *stat2 = avg; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/test/battle/move_effect/guard_split.c b/test/battle/move_effect/guard_split.c new file mode 100644 index 0000000000..3f012ab6e2 --- /dev/null +++ b/test/battle/move_effect/guard_split.c @@ -0,0 +1,22 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_GUARD_SPLIT].effect == EFFECT_GUARD_SPLIT); +} + +SINGLE_BATTLE_TEST("Guard Split averages users and targets Def and Sp. Def stats") +{ + GIVEN { + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_IVYSAUR); + } WHEN { + TURN { MOVE(player, MOVE_GUARD_SPLIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUARD_SPLIT, player); + } THEN { + EXPECT_EQ(player->defense, opponent->defense); + EXPECT_EQ(player->spDefense, opponent->spDefense); + } +} diff --git a/test/battle/move_effect/power_split.c b/test/battle/move_effect/power_split.c new file mode 100644 index 0000000000..70d1bfd5ea --- /dev/null +++ b/test/battle/move_effect/power_split.c @@ -0,0 +1,22 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_POWER_SPLIT].effect == EFFECT_POWER_SPLIT); +} + +SINGLE_BATTLE_TEST("Power Split averages user and targets Atk and Sp. Atk stats") +{ + GIVEN { + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_IVYSAUR); + } WHEN { + TURN { MOVE(player, MOVE_POWER_SPLIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_SPLIT, player); + } THEN { + EXPECT_EQ(player->attack, opponent->attack); + EXPECT_EQ(player->spAttack, opponent->spAttack); + } +} From 8ca234de7e1e18459989e59919de3881a3941274 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 17 Aug 2024 19:38:55 +0200 Subject: [PATCH 110/225] Removed gBitTable usage again (#5193) Co-authored-by: Hedara --- 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 25cee6dfa9..10b5f25e0c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4738,9 +4738,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && (gBattleWeather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + else if (ability == ABILITY_PROTOSYNTHESIS && (gBattleWeather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + else if (ability == ABILITY_QUARK_DRIVE && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; // stat stages From a958e6111017d7acb8632a013020fb75958cd5b9 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 17 Aug 2024 15:33:11 -0500 Subject: [PATCH 111/225] Fix using Population Dice with Loaded Dice printing garbage text (#5195) --- 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 aefce1f0a9..9412737fae 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3641,13 +3641,14 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) else { gMultiHitCounter = gMovesInfo[gCurrentMove].strikeCount; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_DARTS && CanTargetPartner(gBattlerAttacker, gBattlerTarget) && TargetFullyImmuneToCurrMove(gBattlerAttacker, gBattlerTarget)) gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); } + + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } else if (B_BEAT_UP >= GEN_5 && gMovesInfo[gCurrentMove].effect == EFFECT_BEAT_UP) { From bc5f40e5182e78ca05c0048b089d1fa75a86597a Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:25:44 +0100 Subject: [PATCH 112/225] Adds missing Wind Rider activation and tests (#5207) * Adds missing Wind Rider activation + tests * Adds test for opponent setting up Tailwind * Update src/battle_util.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_util.c | 13 ++++ test/battle/ability/wind_rider.c | 127 +++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 test/battle/ability/wind_rider.c diff --git a/src/battle_util.c b/src/battle_util.c index 9412737fae..f489ea6258 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4766,6 +4766,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + case ABILITY_WIND_RIDER: + if (!gSpecialStatuses[battler].switchInAbilityDone + && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) + && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) + { + gBattleScripting.savedBattler = gBattlerAttacker; + gBattlerAttacker = battler; + gSpecialStatuses[battler].switchInAbilityDone = TRUE; + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + effect++; + } + break; case ABILITY_DESOLATE_LAND: if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN_PRIMAL, TRUE)) { diff --git a/test/battle/ability/wind_rider.c b/test/battle/ability/wind_rider.c new file mode 100644 index 0000000000..57e6f0d275 --- /dev/null +++ b/test/battle/ability/wind_rider.c @@ -0,0 +1,127 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(gMovesInfo[MOVE_TAILWIND].windMove == TRUE); +} + +SINGLE_BATTLE_TEST("Wind Rider raises Attack by one stage if it sets up Tailwind") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(opponent, MOVE_TAILWIND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponent); + ABILITY_POPUP(opponent, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Bramblin's Attack rose!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +DOUBLE_BATTLE_TEST("Wind Rider raises Attack by one stage if Tailwind is setup by its partner") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TAILWIND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft); + ABILITY_POPUP(opponentRight, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Bramblin's Attack rose!"); + } THEN { + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Wind Rider doesn't raise Attack if opponent sets up Tailwind") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(player, MOVE_TAILWIND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Bramblin's Attack rose!"); + } + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Wind Rider raises Attack by one stage if switched into Tailwind on its side of the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(opponent, MOVE_TAILWIND); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponent); + ABILITY_POPUP(opponent, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Bramblin's Wind Rider raised its Attack!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Wind Rider activates when it's no longer effected by Neutralizing Gas") +{ + GIVEN { + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(opponent, MOVE_TAILWIND); } + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing Gas filled the area!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponent); + SWITCH_OUT_MESSAGE("Weezing"); + MESSAGE("The effects of Neutralizing Gas wore off!"); + ABILITY_POPUP(opponent, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Bramblin's Wind Rider raised its Attack!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Wind Rider absorbs Wind moves and raises Attack by one stage") +{ + ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } + } WHEN { + TURN { MOVE(player, MOVE_GUST); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, player); + HP_BAR(opponent); + } + ABILITY_POPUP(opponent, ABILITY_WIND_RIDER); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Bramblin's Attack rose!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} From 3a6c3d580d2ac68a6f92588b5ede7c56b791a13e Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 19 Aug 2024 19:03:47 +0200 Subject: [PATCH 113/225] Round Tests (#5196) * Round Tests * Apply suggestions from code review Co-authored-by: Eduardo Quezada --------- Co-authored-by: Hedara Co-authored-by: Eduardo Quezada --- test/battle/move_effect/round.c | 115 ++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 test/battle/move_effect/round.c diff --git a/test/battle/move_effect/round.c b/test/battle/move_effect/round.c new file mode 100644 index 0000000000..c911c96b63 --- /dev/null +++ b/test/battle/move_effect/round.c @@ -0,0 +1,115 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_ROUND].effect == EFFECT_ROUND); +} + +DOUBLE_BATTLE_TEST("Round allows other battlers which also selected the moves to immediately use the move, ignoring turn order") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); + ASSUME(gMovesInfo[MOVE_IRON_HEAD].additionalEffects[0].moveEffect == MOVE_EFFECT_FLINCH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LAGGING_TAIL); } + } WHEN { + TURN { + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_IRON_HEAD, target: opponentRight); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_IRON_HEAD, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_IRON_HEAD, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Round usages beyond the first one has double base power") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + } + } SCENE { + HP_BAR(playerLeft, captureDamage: &damage[0]); + HP_BAR(playerLeft, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + } +} + +DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Round users moving immediately") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} +DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Round users moving immediately with switch") +{ + KNOWN_FAILING; // #5148 + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + SWITCH(playerRight, 2); + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Round causes opposing pokemon to use Round immediately") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LAGGING_TAIL); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_ROUND, target: opponentLeft); MOVE(playerLeft, MOVE_CELEBRATE, target: opponentRight); MOVE(opponentRight, MOVE_ROUND, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} From a11f03ed9d9cdf31b291144b7c2e16f0573bc049 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 19 Aug 2024 18:25:39 -0400 Subject: [PATCH 114/225] Version 1.9.1 (#5199) * Version 1.9.1 * Added 5195 * Apply suggestions from code review Co-authored-by: hedara90 <90hedara@gmail.com> * Added 5196 and 5207 --------- Co-authored-by: hedara90 <90hedara@gmail.com> --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- CHANGELOG.md | 1 + README.md | 2 +- docs/SUMMARY.md | 8 +- docs/changelogs/1.9.x/1.9.1.md | 140 ++++++++++++++++++ docs/changelogs/template.md | 5 +- include/constants/expansion.h | 4 +- 9 files changed, 158 insertions(+), 11 deletions(-) create mode 100644 docs/changelogs/1.9.x/1.9.1.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 310f92c118..edebc1bbf0 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.0 (Latest release) + - 1.9.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.0 - 1.8.6 - 1.8.5 - 1.8.4 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 9fcb1595a2..dd3024230b 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.0 (Latest release) + - 1.9.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.0 - 1.8.6 - 1.8.5 - 1.8.4 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 73d9fd11d3..29960c267b 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.0 (Latest release) + - 1.9.1 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.0 - 1.8.6 - 1.8.5 - 1.8.4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0999ae5f7e..fb2f38af1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pokeemerald-Expansion Changelogs ## 1.9.x +- **[Version 1.9.1](docs/changelogs/1.9.x/1.9.1.md) - 🧹 Bugfix Release** - **[Version 1.9.0](docs/changelogs/1.9.x/1.9.0.md) - ✨ Feature Release** ## 1.8.x diff --git a/README.md b/README.md index 3a87ac27f6..f09f5a7d90 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` -Based off RHH's pokeemerald-expansion 1.9.0 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.9.1 https://github.com/rh-hideout/pokeemerald-expansion/ ``` ## What features are included? diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 0e065d018e..603fa225db 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -12,10 +12,10 @@ - [How to add a new move](./how_to_new_move.md) - [How to add a new trainer class](./how_to_trainer_class.md) - [How to add a new Pokémon]() - - [v1.9.0](./how_to_new_pokemon_1_9_0.md) - - [v1.8.0](./how_to_new_pokemon_1_8_0.md) - - [v1.7.0](./how_to_new_pokemon_1_7_0.md) - - [v1.6.0](./how_to_new_pokemon_1_6_0.md) + - [v1.9.x](./how_to_new_pokemon_1_9_0.md) + - [v1.8.x](./how_to_new_pokemon_1_8_0.md) + - [v1.7.x](./how_to_new_pokemon_1_7_0.md) + - [v1.6.x](./how_to_new_pokemon_1_6_0.md) - [How to use the Testing System](./how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.9.x]() diff --git a/docs/changelogs/1.9.x/1.9.1.md b/docs/changelogs/1.9.x/1.9.1.md new file mode 100644 index 0000000000..8393727c2a --- /dev/null +++ b/docs/changelogs/1.9.x/1.9.1.md @@ -0,0 +1,140 @@ +# Version 1.9.1 + +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.9.1`. +``` + +## 🌋 *REFACTORS* 🌋 +* Removed `ENDTURN_RETALIATE` in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182) +* Removed `ENDTURN_WEATHER_FORM` and `allowedToChangeFormInWeather` in [#5171](https://github.com/rh-hideout/pokeemerald-expansion/pull/5171) + +## 🧬 General 🧬 +### Added +* Move Relearner UI now displays move category by @kittenchilly in [#5081](https://github.com/rh-hideout/pokeemerald-expansion/pull/5081) +### Fixed +* Fixes wrong padding field in `SpeciesInfo` struct by @AlexOn1ine in [#5139](https://github.com/rh-hideout/pokeemerald-expansion/pull/5139) +* Fixed specific tiles changing to PC tiles when using Box Link/Debug PC option by @cawtds in [#5141](https://github.com/rh-hideout/pokeemerald-expansion/pull/5141) + +## 🐉 Pokémon 🐉 +### Fixed +* Fixed stray transparent pixels in Urshifu sprites by @hedara90 in [#5071](https://github.com/rh-hideout/pokeemerald-expansion/pull/5071) +* Fixed `bufferspeciesname` not working for species IDs over 1023 by @SBird1337 in [#5088](https://github.com/rh-hideout/pokeemerald-expansion/pull/5088) +* Fixed overworld Pokémon breaking for species IDs above 1535 by @hedara90, @mrgriffin and +@SarnPoke in [#5179](https://github.com/rh-hideout/pokeemerald-expansion/pull/5179) +* Fixed overworld palettes for multiple species by @hedara90 in [#5107](https://github.com/rh-hideout/pokeemerald-expansion/pull/5107) + * Dialga Origin (Normal and Shiny) + * Palkia Origin (Normal and Shiny) + * Giratina Origin (shiny palette fixed by @hedara90 in [#5108](https://github.com/rh-hideout/pokeemerald-expansion/pull/5108)) + * Xerneas Neutral/Active (Normal and Shiny) + * Enamorus Incarnate/Therian (Normal and Shiny) +* Fixed/added missing Pokémon sprites and palettes by @Cafeei in [#5126](https://github.com/rh-hideout/pokeemerald-expansion/pull/5126) + * Overworld: + * Shiny Sneasler, Morelul, Bounsweet, Bruxish, Guzzlord, Regieleki, Zacian, Zamazenta + * Hisuian Zorua sprite + * Shiny Summer Sawsbuck + * Shiny Galarian Yamask, Darumaka, Zigzagoon, Zapdos, Ponyta, Rapidash, Slowpoke, Farfetch'd, Weezing, Mr. Mime, Articuno, Moltres, Slowking, Stunfisk, Darmanitan + * Shiny Hisuian Sneasel, Qwilfish, Samurott, + * Battle sprites: + * Shiny Sneasler, Cursola, Pincurchin, Runerigus + * Shiny Galarian Yamask, Darumaka +* Fixed Unown Overworld follower sprites by Sarn by @hedara90 in [#5146](https://github.com/rh-hideout/pokeemerald-expansion/pull/5146) + +## ⚔️ Battle General ⚔️ +### Changed +* Set new animation particles by default to off by @AlexOn1ine in [#5161](https://github.com/rh-hideout/pokeemerald-expansion/pull/5161) +### Fixed +* Fixed speed ties by @mrgriffin in [#4780](https://github.com/rh-hideout/pokeemerald-expansion/pull/4780) + * Cleanup by @hedara90 in [#5092](https://github.com/rh-hideout/pokeemerald-expansion/pull/5092) +* Fixed Defiant/Competitive not working after the battler enters the field with a Court Changed Sticky Web on its side of the field by @PhallenTree in [#5093](https://github.com/rh-hideout/pokeemerald-expansion/pull/5093) +* Fixed `trainerproc` not properly parsing line markers, which caused erroring lines to be offset by @mrgriffin in [#5122](https://github.com/rh-hideout/pokeemerald-expansion/pull/5122) +* Fixed initial Zigzagoon battle being able to use a Gimmick by @AlexOn1ine in [#5129](https://github.com/rh-hideout/pokeemerald-expansion/pull/5129) +* Fixed incorrect rounding when `maxHP` is lower than 16 by @hedara90 in [#5183](https://github.com/rh-hideout/pokeemerald-expansion/pull/5183) + * This caused these Pokémon to not be hurt by Sandstorm/Hail. +* Fixes UB in `Cmd_averagestats` by @mrgriffin and @AlexOn1ine in [#5191](https://github.com/rh-hideout/pokeemerald-expansion/pull/5191) + +## 🤹 Moves 🤹 +### Added +* Added move animations for multiple moves by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159) + * Spin Out, Mortal Spin, Fillet Away, Flower Trick, Make It Rain, Shed Tail, Hyper Drill, Twin Beam, Comeuppance, Blood Moon, Fickle Beam, Thunder Clap, Hard Press, Dragon Cheer, Malignant Chain. + * Purple chains by ogwon on Discord, beam by @TheTrueSadfish and livra on Discord. +### Changed +* Adjusted Raging Bull's animation to include Brick Break's wall break effect by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159) +### Fixed +* Fixed non-grass Ivy Cudgel breaking battle UI by @hedara90 in [#5117](https://github.com/rh-hideout/pokeemerald-expansion/pull/5117) +* Fixes Stomping Tantrum effect not doubling power in certain situations by @AlexOn1ine in [#5140](https://github.com/rh-hideout/pokeemerald-expansion/pull/5140) +* Fixed Fickle Beam's description by @PhallenTree in [#5093](https://github.com/rh-hideout/pokeemerald-expansion/pull/5093) +* Fixed Revelation Dance interactions with Z-Move, Roost and typeless mons by @PhallenTree in [#5133](https://github.com/rh-hideout/pokeemerald-expansion/pull/5133) +* Fixes Poltergeist missing its accuracy check by @AlexOn1ine in [#5168](https://github.com/rh-hideout/pokeemerald-expansion/pull/5168) +* Fixed Fickle Beam not showing its message by @TheTrueSadfish in [#5159](https://github.com/rh-hideout/pokeemerald-expansion/pull/5159) +* Fixed Retaliate not working correctly if the party member fainted via passive damage during end of turn by @hedara90 in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182) +* Fixed Flame Burst's passive damage being based off current HP rather than Max HP by @hedara90 in [#5182](https://github.com/rh-hideout/pokeemerald-expansion/pull/5182) +* Fixed using Population Bomb with Loaded Dice printing garbage text by @kittenchilly in [#5195](https://github.com/rh-hideout/pokeemerald-expansion/pull/5195) + +## 🎭 Abilities 🎭 +### Added +* Added in-battle effect of Pickup by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170) +### Fixed +* Fixes Purifying Salt not halving damage for dynamic move types by @AlexOn1ine in [#5145](https://github.com/rh-hideout/pokeemerald-expansion/pull/5145) +* Fixed Dancer-called moves not changing their type based on the new user by @PhallenTree in [#5133](https://github.com/rh-hideout/pokeemerald-expansion/pull/5133) +* Fixed Ice Face not regenerating after switching in during Hail/Snow by @hedara90 in [#5171](https://github.com/rh-hideout/pokeemerald-expansion/pull/5171) +* Fixed Wind Rider not activating when switched in while Tailwind is active on the user's side of the field activation and tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207 + +## 🧶 Items 🧶 +### Added +* Added Dowsing Machine's expanded name by @kittenchilly in [#5134](https://github.com/rh-hideout/pokeemerald-expansion/pull/5134) +### Fixed +* Fixes Booster Energy not increasing speed by @AlexOn1ine in [#5167](https://github.com/rh-hideout/pokeemerald-expansion/pull/5167) + +## 🤖 Battle AI 🤖 +### Changed +* Adjusted AI calculation for Triple Kick Effect by @AlexOn1ine in [#5127](https://github.com/rh-hideout/pokeemerald-expansion/pull/5127) +### Fixed +* Fix Switch AI Bug: AI never switching out when it could be OHKO'd by @Pawkkie in [#5089](https://github.com/rh-hideout/pokeemerald-expansion/pull/5089) +* Adds missing AI checks for poltergeist by @AlexOn1ine in [#5189](https://github.com/rh-hideout/pokeemerald-expansion/pull/5189) + +## 🧹 Other Cleanup 🧹 +* `IsValidForBattle` function formatting by @AlexOn1ine in [#5085](https://github.com/rh-hideout/pokeemerald-expansion/pull/5085) +* Opportunist/Mirror Herb cleanup by @AlexOn1ine in [#5120](https://github.com/rh-hideout/pokeemerald-expansion/pull/5120) + * Cleanup by @AlexOn1ine in [#5158](https://github.com/rh-hideout/pokeemerald-expansion/pull/5158) +* Remove trailing whitespace (master) by @AsparagusEduardo in [#5174](https://github.com/rh-hideout/pokeemerald-expansion/pull/5174) + +## 🧪 Test Runner 🧪 +### Added +* Added missing Move Effect TODO tests - Volume C by @AsparagusEduardo in [#5094](https://github.com/rh-hideout/pokeemerald-expansion/pull/5094) +* Added multiple missing ability TODO tests by @AsparagusEduardo in [#5163](https://github.com/rh-hideout/pokeemerald-expansion/pull/5163) +* Added missing Guard/Power split tests by @mrgriffin and @AlexOn1ine in [#5191](https://github.com/rh-hideout/pokeemerald-expansion/pull/5191) +* Added missing Harvest and Pickup tests by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170) +* Added missing Round tests by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/5196 +* Added missing Wind Rider tests by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/5207 +### Changed +* Fixed G-Max Replenish not considering Gen 5+ Pickup by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170) +### Fixed +* Fixed `RandomUniformExcept` not being exclusive on the higher boundary by @PhallenTree in [#5170](https://github.com/rh-hideout/pokeemerald-expansion/pull/5170) + + +## 📚 Documentation 📚 +* Added guide to running documentation website locally by @AsparagusEduardo in [#5059](https://github.com/rh-hideout/pokeemerald-expansion/pull/5059) +* How to docs and fixes to be added to the mdbook documentation site by @anrichtait in [#5070](https://github.com/rh-hideout/pokeemerald-expansion/pull/5070) +* Improved 1.8 ⇒ 1.9 non-Competitive syntax migration instructions by @mrgriffin in [#5079](https://github.com/rh-hideout/pokeemerald-expansion/pull/5079) + +## 📦 Branch Synchronisation 📦 +### pret +* 5th of August in [#5098](https://github.com/rh-hideout/pokeemerald-expansion/pull/5098) + * Fixed bottom half of Mt. Pyre not being labeled in PokeNav by @fdeblasio in [pret#2018](https://github.com/pret/pokeemerald/pull/2018) +* 7th of August in [#5116](https://github.com/rh-hideout/pokeemerald-expansion/pull/5116) + * Changed type1 and type2 to be consistent by @pkmnsnfrn in [pret#2021](https://github.com/pret/pokeemerald/pull/2021) +* 14th of August in [#5165](https://github.com/rh-hideout/pokeemerald-expansion/pull/5165) + * Fix type for offset in MapConnection by @GriffinRichards in [pret#2011](https://github.com/pret/pokeemerald/pull/2011) +### Followers +* 7th of August in [#5110](https://github.com/rh-hideout/pokeemerald-expansion/pull/5110) + * Fixed expanded OW IDs by @pkmnsnfrn in [aarant#38](https://github.com/aarant/pokeemerald/pull/38) + * Fix two small text errors in follower dialogue by @Bassoonian in [aarant#39](https://github.com/aarant/pokeemerald/pull/39) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.0...expansion/1.9.1 + +## New Contributors +* @TheTrueSadfish made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/5159 + + diff --git a/docs/changelogs/template.md b/docs/changelogs/template.md index 6641d612f3..a40afebad3 100644 --- a/docs/changelogs/template.md +++ b/docs/changelogs/template.md @@ -122,7 +122,10 @@ ### Fixed * N/A -## 📦 Pret merges 📦 +## 📦 Branch Synchronisation 📦 +### pret's base pokeemerald +* N/A +### merrp/aarant's followers * N/A diff --git a/include/constants/expansion.h b/include/constants/expansion.h index ad79d584cb..9fc3a6fe73 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// 1.9.0 +// 1.9.1 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 9 #define EXPANSION_VERSION_PATCH 1 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From becb2fcac839a36df868297a8945ec51f32123ad Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 19 Aug 2024 18:29:48 -0400 Subject: [PATCH 115/225] Start 1.9.2 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 9fc3a6fe73..caf7e4ddab 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // 1.9.1 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 9 -#define EXPANSION_VERSION_PATCH 1 +#define EXPANSION_VERSION_PATCH 2 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif From a111ac496d08d580bcb83998a0e0a678acec53d6 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Tue, 20 Aug 2024 06:44:27 -0400 Subject: [PATCH 116/225] Fix typos (#5221) Fix typos in move description of Decorate, Collision Course and Electro Drift --- src/data/moves_info.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index bec17632ec..08579f274f 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -17470,7 +17470,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .name = COMPOUND_STRING("Decorate"), .description = COMPOUND_STRING( "The user sharply raises\n" - "the target's Atk and Sp.Atk"), + "the target's Atk and Sp.Atk."), .effect = EFFECT_DECORATE, .power = 0, .type = TYPE_FAIRY, @@ -19739,7 +19739,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .name = HANDLE_EXPANDED_MOVE_NAME("ColisinCours", "Collision Course"), .description = COMPOUND_STRING( "Prehistoric explosion that's\n" - "stronger if supereffective."), + "stronger if super effective."), .effect = EFFECT_COLLISION_COURSE, .power = 100, .type = TYPE_FIGHTING, @@ -19758,7 +19758,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .name = HANDLE_EXPANDED_MOVE_NAME("ElectroDrift", "Electro Drift"), .description = COMPOUND_STRING( "Futuristic electricity. It's\n" - "stronger if supereffective."), + "stronger if super effective."), .effect = EFFECT_COLLISION_COURSE, .power = 100, .type = TYPE_ELECTRIC, From af12697845f83b2a9984556af436c9668a938c5a Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Tue, 20 Aug 2024 04:23:33 -0700 Subject: [PATCH 117/225] Adds OW_BERRY_IMMORTAL (#5187) * Added OW_BERRY_IMMORTAL Added cases for OW_BERRY_IMMORTAL * removed one preproc * removed other preproc * Fixed identation * Set config to FALSE * Update include/config/overworld.h per https://github.com/rh-hideout/pokeemerald-expansion/pull/5187#discussion_r1720747388 Co-authored-by: Bassoonian * Reordered condition per https://github.com/rh-hideout/pokeemerald-expansion/pull/5187\#discussion_r1720747652 * Update include/config/overworld.h --------- Co-authored-by: Bassoonian --- include/config/overworld.h | 1 + src/berry.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index b47cef5c50..63479f1831 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -33,6 +33,7 @@ #define OW_BERRY_GROWTH_RATE GEN_3 // Presets for how long each Berry plant takes to grow. #define OW_BERRY_YIELD_RATE GEN_3 // Presets for how many Berries each plant can yield. #define OW_BERRY_DRAIN_RATE GEN_6_ORAS // If OW_BERRY_MOISTURE is enabled, this setting changes how fast the soil dries out. GEN_4 uses a Berry-dependent drain rate, GEN_6_XY dries out in 24 hours (4 hours with the relevant Mulch) and GEN_6_ORAS dries out in 4 hours. Other values are illegal. +#define OW_BERRY_IMMORTAL FALSE // If enabled, once a Berry tree has grown a Berry, the tree will not disappear until picked by the player. // Overworld Pokémon #define OW_POKEMON_OBJECT_EVENTS TRUE // Adds Object Event fields for every species. Can be used for NPCs using the OBJ_EVENT_GFX_SPECIES macro (eg. OBJ_EVENT_GFX_SPECIES(BULBASAUR)) diff --git a/src/berry.c b/src/berry.c index 9f187bd1e2..1a1c3b7f1f 100644 --- a/src/berry.c +++ b/src/berry.c @@ -1817,6 +1817,8 @@ bool32 BerryTreeGrow(struct BerryTree *tree) tree->stage = BERRY_STAGE_BERRIES; break; case BERRY_STAGE_BERRIES: + if (OW_BERRY_IMMORTAL) + break; tree->watered = 0; tree->berryYield = 0; tree->stage = BERRY_STAGE_SPROUTED; @@ -1842,16 +1844,16 @@ static u16 GetMulchAffectedGrowthRate(u16 berryDuration, u8 mulch, u8 stage) void BerryTreeTimeUpdate(s32 minutes) { int i; - u8 drainVal; + u32 drainVal; struct BerryTree *tree; for (i = 0; i < BERRY_TREES_COUNT; i++) { tree = &gSaveBlock1Ptr->berryTrees[i]; - if (tree->berry && tree->stage && !tree->stopGrowth) + if (tree->berry && tree->stage && !tree->stopGrowth && (!OW_BERRY_IMMORTAL || tree->stage != BERRY_STAGE_BERRIES)) { - if (minutes >= GetStageDurationByBerryType(tree->berry) * 71) + if ((!OW_BERRY_IMMORTAL) && (minutes >= GetStageDurationByBerryType(tree->berry) * 71)) { *tree = gBlankBerryTree; } From bde69828909cfe2edbda93a0065fc836e95b1cbf Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:24:48 +0200 Subject: [PATCH 118/225] =?UTF-8?q?Fixes=20weather=20abilities=20not=20act?= =?UTF-8?q?ivating=20when=20Cloud=20Nine=20user=20leaves=20th=E2=80=A6=20(?= =?UTF-8?q?#5209)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes weather abilities not activating when Cloud Nine user leaves the field * parametrize --- data/battle_scripts_1.s | 4 ++-- src/battle_script_commands.c | 29 +++++++++++++++++++++-------- src/battle_util.c | 13 +++++++------ test/battle/ability/forecast.c | 22 ++++++++++++++++++++++ 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 95fffd0513..083143bdf2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7150,7 +7150,7 @@ BattleScript_TargetFormChangeWithStringNoPopup:: BattleScript_BattlerFormChangeWithStringEnd3:: pause 5 - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting flushtextbox handleformchange BS_SCRIPTING, 0 handleformchange BS_SCRIPTING, 1 @@ -8010,7 +8010,7 @@ BattleScript_DeltaStreamActivates:: end3 BattleScript_ProtosynthesisActivates:: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_SUNLIGHTACTIVATEDABILITY waitmessage B_WAIT_TIME_MED printstring STRINGID_STATWASHEIGHTENED diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9165d7b7e4..efa841a631 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7292,19 +7292,32 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gDisableStructs[battler].truantSwitchInHack = 0; - for (i = 0; i < gBattlersCount; i++) - { - if (i != battler - && GetBattlerAbility(i) == ABILITY_TRACE - && AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0)) - return TRUE; - } - if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler, FALSE)) return TRUE; else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0)) return TRUE; + for (i = 0; i < gBattlersCount; i++) + { + if (i == battler) + continue; + + switch (GetBattlerAbility(i)) + { + case ABILITY_TRACE: + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0)) + return TRUE; + break; + case ABILITY_FORECAST: + case ABILITY_FLOWER_GIFT: + case ABILITY_ICE_FACE: + case ABILITY_PROTOSYNTHESIS: + if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0)) + return TRUE; + break; + } + } + gDisableStructs[battler].stickyWebDone = FALSE; gDisableStructs[battler].spikesDone = FALSE; gDisableStructs[battler].toxicSpikesDone = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index f489ea6258..b133b7c629 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4767,7 +4767,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WIND_RIDER: - if (!gSpecialStatuses[battler].switchInAbilityDone + if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) { @@ -6269,17 +6269,17 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. - battler = gBattlerAbility = gBattleScripting.battler; gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) { case ABILITY_FORECAST: case ABILITY_FLOWER_GIFT: if ((IsBattlerWeatherAffected(battler, gBattleWeather) - || gBattleWeather == B_WEATHER_NONE - || !WEATHER_HAS_EFFECT) // Air Lock active - && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) + || gBattleWeather == B_WEATHER_NONE + || !WEATHER_HAS_EFFECT) // Air Lock active + && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { + gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } @@ -6290,6 +6290,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { // TODO: Convert this to a proper FORM_CHANGE type. + gBattleScripting.battler = battler; gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; @@ -6300,7 +6301,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gDisableStructs[battler].weatherAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); - gBattlerAbility = gBattleScripting.battler = battler; + gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates); effect++; } diff --git a/test/battle/ability/forecast.c b/test/battle/ability/forecast.c index 296c123dbd..24a0eed957 100644 --- a/test/battle/ability/forecast.c +++ b/test/battle/ability/forecast.c @@ -397,3 +397,25 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back when it uses a move that f EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_CASTFORM); } } + +SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user leaves the field") +{ + u32 species = 0, ability = 0; + PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); } + OPPONENT(species) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_CELEBRATE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("2 sent out Wobbuffet!"); + ABILITY_POPUP(player, ABILITY_FORECAST); + MESSAGE("Castform transformed!"); + } +} From d379ffef3e86f38739e95827cca3daa2cacac0bc Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 20 Aug 2024 14:24:42 +0200 Subject: [PATCH 119/225] Fixed Confide+Crafty Shield interaction (#5202) Co-authored-by: Hedara --- src/battle_util.c | 17 ++++---- test/battle/move_effect/protect.c | 65 +++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index b133b7c629..c2e05cbd4e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8560,16 +8560,20 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) // Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here. // This means extra logic is needed to handle Shell Side Arm. if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST - && (gMovesInfo[move].makesContact - || (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL)) - && !gProtectStructs[battlerDef].maxGuarded) // Max Guard cannot be bypassed by Unseen Fist + && (gMovesInfo[move].makesContact + || (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM + && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL)) + && !gProtectStructs[battlerDef].maxGuarded) // Max Guard cannot be bypassed by Unseen Fist return FALSE; + else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD + && IS_MOVE_STATUS(move)) + return TRUE; else if (gMovesInfo[move].ignoresProtect) return FALSE; else if (gProtectStructs[battlerDef].protected) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_WIDE_GUARD - && GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + && GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) return TRUE; else if (gProtectStructs[battlerDef].banefulBunkered) return TRUE; @@ -8586,11 +8590,8 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_QUICK_GUARD && GetChosenMovePriority(gBattlerAttacker) > 0) return TRUE; - else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD - && IS_MOVE_STATUS(move)) - return TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MAT_BLOCK - && !IS_MOVE_STATUS(move)) + && !IS_MOVE_STATUS(move)) return TRUE; else return FALSE; diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 973033bc33..aca5ef859d 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -482,3 +482,68 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from status moves") } } } + +SINGLE_BATTLE_TEST("Protect does not block Confide") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_CONFIDE); } + } SCENE { + MESSAGE("Wobbuffet used Confide!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFIDE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + NOT MESSAGE("Foe Wobbuffet protected itself!"); + } +} + +DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_CRAFTY_SHIELD); MOVE(playerLeft, MOVE_CONFIDE, target: opponentLeft); MOVE(playerRight, MOVE_CONFIDE, target: opponentRight); } + } SCENE { + MESSAGE("Wobbuffet used Confide!"); + MESSAGE("Foe Wobbuffet protected itself!"); + MESSAGE("Wynaut used Confide!"); + MESSAGE("Foe Wynaut protected itself!"); + } +} + +DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all battlers") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FLOWER_SHIELD].target == MOVE_TARGET_ALL_BATTLERS); + ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + PLAYER(SPECIES_TANGELA); + PLAYER(SPECIES_TANGROWTH); + OPPONENT(SPECIES_SUNKERN); + OPPONENT(SPECIES_SUNFLORA); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_CRAFTY_SHIELD); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_FLOWER_SHIELD); MOVE(playerRight, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Tangela used Flower Shield!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Tangela's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Foe Sunkern's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Tangrowth's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("Foe Sunflora's Defense rose!"); + } +} From bd38c64f298ea64c1b1051181f1aaa7ec1697cd8 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Tue, 20 Aug 2024 13:16:32 -0500 Subject: [PATCH 120/225] New Garganacl and Naclstack battle sprite + various battle sprite fixes (#5142) Garganacl, Spidops, Wattrel, Kilowattrel, Shroodle, Bombirdier, Orthworm, Veluza, Aerodactyl-Mega, Medicham-Mega, Latis-Mega, Diancie-Mega, Ponyta-Galar, Rapidash-Galar, Magearna, Landorus. --- graphics/pokemon/absol/mega/front.png | Bin 1028 -> 1001 bytes graphics/pokemon/aerodactyl/mega/front.png | Bin 1135 -> 1070 bytes graphics/pokemon/bombirdier/front.png | Bin 897 -> 877 bytes graphics/pokemon/diancie/mega/back.png | Bin 934 -> 856 bytes graphics/pokemon/diancie/mega/front.png | Bin 1171 -> 1118 bytes graphics/pokemon/diancie/mega/normal.pal | 30 ++++++++-------- graphics/pokemon/diancie/mega/shiny.pal | 30 ++++++++-------- graphics/pokemon/garganacl/back.png | Bin 526 -> 621 bytes graphics/pokemon/garganacl/front.png | Bin 837 -> 951 bytes graphics/pokemon/garganacl/normal.pal | 30 ++++++++-------- graphics/pokemon/garganacl/shiny.pal | 30 ++++++++-------- graphics/pokemon/kilowattrel/back.png | Bin 550 -> 535 bytes graphics/pokemon/kilowattrel/front.png | Bin 608 -> 593 bytes graphics/pokemon/kilowattrel/shiny.pal | 4 +-- graphics/pokemon/landorus/anim_front.png | Bin 1501 -> 1491 bytes graphics/pokemon/landorus/back.png | Bin 948 -> 885 bytes graphics/pokemon/landorus/normal.pal | 6 ++-- graphics/pokemon/landorus/shiny.pal | 32 +++++++++--------- graphics/pokemon/latias/mega/front.png | Bin 975 -> 897 bytes graphics/pokemon/latios/mega/front.png | Bin 975 -> 897 bytes graphics/pokemon/magearna/back.png | Bin 716 -> 646 bytes graphics/pokemon/magearna/shiny.pal | 20 +++++------ graphics/pokemon/medicham/mega/back.png | Bin 792 -> 909 bytes graphics/pokemon/medicham/mega/front.png | Bin 1002 -> 889 bytes graphics/pokemon/medicham/mega/normal.pal | 32 +++++++++--------- graphics/pokemon/medicham/mega/shiny.pal | 32 +++++++++--------- graphics/pokemon/naclstack/back.png | Bin 555 -> 389 bytes graphics/pokemon/naclstack/front.png | Bin 711 -> 551 bytes graphics/pokemon/naclstack/normal.pal | 30 ++++++++-------- graphics/pokemon/naclstack/shiny.pal | 32 ++++++++++-------- graphics/pokemon/orthworm/front.png | Bin 700 -> 698 bytes graphics/pokemon/ponyta/galarian/back.png | Bin 721 -> 661 bytes graphics/pokemon/ponyta/galarian/shiny.pal | 14 ++++---- graphics/pokemon/rapidash/galarian/back.png | Bin 738 -> 663 bytes graphics/pokemon/rapidash/galarian/shiny.pal | 6 ++-- graphics/pokemon/salamence/anim_front.png | Bin 1519 -> 1458 bytes graphics/pokemon/salamence/mega/front.png | Bin 1102 -> 984 bytes graphics/pokemon/shroodle/back.png | Bin 402 -> 387 bytes graphics/pokemon/shroodle/front.png | Bin 396 -> 381 bytes graphics/pokemon/shroodle/shiny.pal | 20 +++++------ graphics/pokemon/spidops/front.png | Bin 800 -> 766 bytes graphics/pokemon/veluza/front.png | Bin 698 -> 574 bytes graphics/pokemon/wattrel/back.png | Bin 554 -> 437 bytes graphics/pokemon/wattrel/front.png | Bin 625 -> 492 bytes .../pokemon/species_info/gen_9_families.h | 6 ++-- 45 files changed, 179 insertions(+), 175 deletions(-) diff --git a/graphics/pokemon/absol/mega/front.png b/graphics/pokemon/absol/mega/front.png index e7656154da2a58a0892486f637a9751924d2feff..bc89ac2de0f156fca489866bf0ac589db5cb6ebb 100644 GIT binary patch delta 933 zcmV;W16urq2c0004VQb$4nuFf3kkv=|u17}G@K~z|U&6bOf z;~)%0V?)4U=l{QV{o<7bT4}V>B2C*#xCh%9o8$N&27rDcemC#=JlKnPejxb72j^P= z1epkR`U4Qpb59Te7=c(}Mn~72OPl^1q_r0jfS!!MOehfSB9$AxwICmH3J3 z7X%KH$Yh#-zzpDjr+DrG!AF)qfHa0sURM1p0DRrbfc)^F=|@0IOqlgaU4Su)U4N1d z(N`Fl;ckCODT~qR6+q<6Fk%GQu=vTyc?v?;50+wer|VPI^O&;P0oSO105YreLkArX zz!l>NNR?2NPYiF%(-RO)pM<5p7I}(b8OVu{=0PZ<1EK+cvhStF5l?>9PS8#76CFV_ zAfoL=1z7Gj1plO4-WWg#NsPg|m;5C44eUmc1k8pJ6LF2^N_jjzK4^P zs8VctCa|nX48-oXye&2#7g>u!{4O76Q5h?GF1?}HNr;nIw}#vq6^lNt{mz`L^B08-X29y9_9P~tD~QCEE| zJ^L^NWNltOWzut=7oE++$UZQEuoE&b4N7p}4q!%bkXc`kWisd4`&yB<1W7pFHr;B| zE5NcRJMohNWQBvO1F7dfBU0G{B)()PuQ`zBQ~UvcAdC*U8PE&iwt-X2{qUkM0>EV^ zIiZAR08}5Kd4L93TOlO~Mguf~52&@6>tLkqWlB;Wh6sQra0e6y@W)aQDjc?et1oZP zLGA+yplkt3=vyEFYJgItloY_F69!1o0YF@Y4q~i&M-3o*HtN-^i!th&YQ$D(0g%NO!lQSM132H||z{U5EQP(X%(iSnH-Az8j!B@!nRXA0c(ikhph=3miXcwif=5w*u%I1 zRLBb;q5!yKZrb{e8c|P%RJCPW-<##7U>CvfNWawoVGd00Uh~L_t(Y$E}pVZ__{&$1f3s#~ddat5XOB zMcv$2IT2%UB?p+QS|X!s>1uVWA_}7u8*?+Xs2R&pMgC9tuXyk5SUwk+cuO4L$KUt+ z*nhCzfU(gZ-Zduh&&jX@xQy|C0m5b6Z2?bz!qYCmVZiucPj`VHxPTg<0WM&0(g6er zKn=GR=m5O|2_RAlu$~9UVHgfu83>5M1Bhw>;&BH6v=v<06~N&L&s%`-2!QFcI!~bm zDxg2qFEnrsQI%#-3xrCkl#Peva)qA*$SdKs0EOSo(h5MsAf@~iRWXr=4_ftz9ASEY z;Kd-(>W(3>%nV>E<7+%m*dAE=6%db4$pg0~okywx`~bW#jN$b-e2!HVwybP3(sMFC zL*Qc=o&s#nGHOE&Bp4hKRt?NC4+6mBL`3{cT^|Je%nSV&7)74Nl%uN!ZUQV0cG0>) z0Q@;<0I>bQ@mS@4iux339;i7SkpRqp-~fc=B#`?WAj`AtojxXjM#07uRj%@&1{}!V zAJs&5X-f(r@dIWB%>;_YuhWVs(0>e0A@j8IuT6>DaQUqQ;%N~n8$(Q6Gum^H!|hg= zySQ``navcl+JJD6Z!2J0$ml|4aK#LB*09)Y?`Vt)TiW>RngE8GFSY?5B+^lTHciyP z1UO`g!lCjKiEX&RhtvebESt)NJVaE)3%Kk6R+@n)$U{_hx(hI-fvNUD7O}?w_P{G@ z0eR0@*U4+QPEvc>^${>G70Y!g1O$>4-6Z|Vu5aEtYbkUHj$#_v?G6o~mq_6i2&^5; z!YtHoSDJtKnaD%~JY^iu%loneq($_w z!|)tTNfA*RBXccPkvur|#b>UE{h%zL8o*R4)L0j*nN!uJqkuI~IA;7SxM~kf+5&jz z$&@MXG?(LnDS*q8Fl*ER{llMa1-h1Sm#hg_D{zT;`8GdnHqXl6V5c#EPb*c_cAABk zY8y10@x{j}eW-6FoPC?pwC>VoGkhsm=po$$+DB_|o`gR}@=De(vd2r&KbzmaN@{`r zif+k?2?U$vWG~qN4%1iXp)rqEY6Z=U@lu{|&rcq0Me{hG%kzb~`ljU*rADdscYtEu i{QbE0$o{J__8Wj}Odt*qc?P%u0000c0004VQb$4nuFf3kkv=|u1FT6zK~z|U&6ewS zqdE+QkwoMKhV=d4_GnAOmp~|I&7V=bR-3^7tgG#5`fDR1{9(Q?8Q+z8HUvLz0Yb_T z9SA@?ZUS7&Twvk)G(De=xQ-&9nWH+Hb`IMKua}gWE~ChYzP4+{ZR!ab1?xG$oe#A+ zEU(vVsZR}H1Y%!*q6ct|Dt%9}n0{G0zPnJY7XIF_?v4N%j=OkRzIOrd4-wcmiC`uw zp*`voAQAyE53WaUgy!#h5CoMK*V?MBQ;cB0GMT;u91@*LAbGeAi8O*aPrkr62OtIXT>uyHO;)%|gah;v0R2{F^j64JR6rlWk+3+y>aD1`mgWHO0KEh_0?YaKqs@VA>W>th zcam#;`x*cqLq@QKeIan@A3|D4_HV)kM6g7hX87-r1g@LFy9I4Dh`e?pJ&v464b>n~r` zzTxi{hjwi1*aNJqU4JFFaR|4pBpwr=mxQ^78Ts?hJF)wfLzb)y&)A~ zVsAA$o}dH=wx4aqFe}@>IAcHq5VyHh?`QZ3pp~HBHa{5@N}mXCZn0y{jHvVmfOde@ zYOt=DeOrqIkPc8eJ0aw_d7c4cHXJ~CJJNCS zhyer|T*wP*PN%AOo#J*v2Yocg5ulmTf?YP#qhA2QXdk!&aH(mUsKFOPZ`^L`=)E3E zAo9NfVqLX|C%81+Aaqwu8T!VGd00YQLL_t(Y$F-C(Z`(!`$4?}{XbBLSYB_YV zpF?^jb&ePTMF86eb1n;JK1l(Y6wN@Nq1!tIR8|2+=qXbWX!Dez1^OWhbP1GxfFj5z zNZofwT9jp_oqCJz_Ivh2 zp#olCi<(7J0C?$RodS}eCpEB=J)2AWL7FDD%w$ivQmj=_+X$t209m~nyHaZ4=M~VM zHG6^*sv8n2?{Q=+i@2e@Iuti;Qa}=MbjT+f z=;`nMfGmDW$7z!H>y40J1GL@7V}=K<2JpV%E-w~~#k!SVlBQvQ?x+bi zr1xxrvdYEVcAt=>-@lV0KrexJ;vXV3m-1{^1HDrWzsyC;CUJW=}V>T l85Xzx9oRZD^1ls2{sDarVx+3^&WQj3002ovPDHLkV1f{G=mh`( diff --git a/graphics/pokemon/bombirdier/front.png b/graphics/pokemon/bombirdier/front.png index 97159715f25cfccdb4311cf70ae0b1a77afa006a..b8aa83644ba1f142ff37e0e980d17ef7b4ef173b 100644 GIT binary patch delta 796 zcmV+%1LORG2ki!sBnkm@Qb$4nuFf3kks&^R0_#acK~z|Uy_SK_s~`-8g{BB9`u=Zw zPYWtK6!tH$VLGbi#(

OMX+f)Yks{TF&?&RwWiF#*OmfH_=L z18QaP#{$siJ`w<4SXRsf#> z?=(!V!g~>R0203e#KfDvumDC;hQon>R>2seriDF=yFTxuH4lW+f@Z;Y19>C5l8|t8 zcOYZ*n8BUkd}>O2IxtS!=-I(AxKr=Fx87r|EiAP31Cb!C+}?Y}8-!~P<}HJSAR4Vd zLI5%g2#>#74ss<<087!7pkF&2DBvKlT*!HszxT)!phyA$=Y${$bm~3Y=mg+@w0Fru z^ZsZ)W)gh?kmkt_T6#Wuz-b?dM$QKXK%D_0;9WiZQv*(U6uk6(x)eR~Pm>s?Fobz} z089v}0T$W?AqbxVkQ<6bQ2j5LQi+%__bTxXHl72#J9vH@L)ZNLkF=>)_Oq<;HXI(&G%+(zqV zh-Dk`F7#4Wd+E}IK<_!c08j!Ie-A^s9z4R1U!Kt9Sh2imumGAZuzu6vrYW;-{f-UrY0LcM;pP!=+dAB}WKpMOi z!O-^tvEHFLr}ja9N30k5cj9bytRMGc;+j|mFQSqm{GdE5e0f1f?QG2ON4A8JBeXb#dKXlOu zM(ADhSLi)$yU?y;2K09TT3odBx~eyZoEE4a0P;7_FBZ&%P$zN*kk0^aY(WLkAW*p0 z_m%#thC4vt0C>ydf364{Knx%oAb1NZRk$z00zl#ifSS0|R~Epi%CI`HDiAS0T3E6; z>dQVlx**gREDJdrC>!xA2@TIj2RcTV85{{dPymnHJuwS&iT zQiLo9%mN4le{7^CAPtFCo{s`GAfj&onBIap4jK(W!q?H}(Tf4}SOP(U7uo<_G6zFb zpLm%%UTVsW9n1!-h+Rx60gxK{6xnZsi_d0e;-b%oAxfBdh(kPVWKy}!qKK~|Odu2k zwh-HZ3xMi$PBCizmRnwZ1YCaRX*a~Wjd)dht*YB~e`!Xb_dG5DjKI~;U01IMkFn#s z*3x6e$!sACc$}hXJojcM$PB>q6ua?EaI+5Qtbj*-$K#3M<}HO6fXODOp`YCweQy1c zSAwhb?*N(u`o8=hwaQ=Xiv^@1a}@&pTYyy|pCJVTJJWmpYGHvmJyE{VmnziponHHQ w+UxoGC?G!~rk(sdaWTPvkuQwzt^Ydy0Vbp-S0oA0vH$=807*qoM6N<$f{K5Ai2wiq diff --git a/graphics/pokemon/diancie/mega/back.png b/graphics/pokemon/diancie/mega/back.png index cb9a177a0d55682f96e4e8930397d5d47eea1a6a..3816c40d78e86db71540b37b03a0d07003f7ce32 100644 GIT binary patch delta 845 zcmV-T1G4<42iOLX7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!g;JV1;s zW2QQA=2dzBbm$L2SuL@Xr2zhXHJV?AtKjM zgd*or^$M_ZbblL0>doPm@S~Sm>9pT*B@kW-S3TBhTslVV`v%YuT76TEYs<+ED?%o? zJAGaRe|lELC7lkM1Adx7RQvf?@_#nw15}4*g+BKH)nT6?mC;tF zWQ9I=85YvT3~>YSF8M?H+yh!f&0;WFKI<8<4gi7>2GIo|%Ttm&T1N(yunM9{AR8j0 zm9l)D7!bg^67>LHTmh_>+f%&~N?5FIAy`q%nCi8X@-flZo^~{!6|MT4>lb}#aRViQ zocV|uL4S{WeJE`E^=m0XVvN2bo&fw*sA~gg2gYcKmjK`gNfIcacEei-05OsQE zBtRiZxL5iml|XiZw-2&h@4eGo0`K;HX9y(qgn!WMI{+h^yMqwDe$ORHfSzz?0lEb! z^>GF45T=ACVKR^sXb}Yh5N3cbKo2<2a}&nY!X=<4XaI_UFxiNUfs^tlJ_7^+VHlz} zK^``*7V+Wl9)@Oje8gmWKFANFL>o=;OW6TjY+D-^f9pP3V zKt`r69Y7wYEmyH3ZUF&6^;`MJDmCIJj16MAdng-y0G`Ngv|jb`q X;E7iUepH|4BqaRDVdv&6GcD+dvq`6-^m3 z_~al8=@6elZYT*z7jBoicz57}hb*?P_W`)N88l_L3!b`o z&)D})vaLV)06DPr=YD#g=Y8)a>)i~y)4qqQ_w1-eAW;KElh~7AYJg+hyrGLDr0aUV!&K~2`I+T)eB&8hHEPct?=x`{n2%N}BmcSm`0fKQ?Fm}#h zfPoYvouo)+BLKi-G$euz2{i(c5t5dGKpp^$cL^O5Lfis?`LY+byns{!BnXKK3G_VN z0&deRUtG#kVk00;kWF(uIWT~hC77}L(KPf%w}OMo^r>Xc9?Ayiipz!B{HN(9}BDTNLY1HefM99LFzN_7i72cr-G z$|6X@`jyp;Jq`5W=XABl6n=xp3P3{F*qfB_G{hByhsuuWX<`RNAV^OhtOgMpARts= zILec+)qg!@<8FvcKsX>Eotxt-VD)j=EG7x5qdb^bj}1WK62PJICRp9n9Kb{AU{d!h zRJgB{stZ^aMktVCLIQ-99=I`YAvbma2wZWc3EUKbB_&}jB6#We5WnGI*#tQNz<%X? z*nb1q_mB^OX~kO#`}0cxSOmp7z5Gr!inI>q{D1n7PgtZd{+Q>_Eg<2X=RRx%mE?Nd zH5~R~o?psy0KOUExgjv$0fj_1YYXt(*Z}t$;CWkMY{vqsz}f?@+5$7El11qgPBL@Z z7AS!9$y`=FN`cSN1`VVi%=Ne-aQz!gS^z&YUh_D}3Wpz1C4}syKa)C8I+Va-iI0-H zM}LuN1{nIE?LuZ{At}{{G9_z-;{j^Mp(^@LE$SB79%G zm|Y)$!|7|$%W*ZrdWmEG@zEBmb&_XWpm2Cztn327c)eJ`if1+8`hIzQraxceC{0&q y%Xw~y+14SyJ+spdkp9ARZixD(d9TB={uKjh@P;_$aK%^v0000c0004VQb$4nuFf3k0000mP)t-sn9!hEP+4|KGlD*=!e*A@y8!XIR|FEqOudx_`SSB3+krjw@cHnaOS6 zdq62UFG~?Ah6Y5=0{Llc?7`d+#!0}Bo^iK_Recwyd z+nPc=>mM8FRe#0G0U(l8wSTG)K+IZZ2!)GT33#d}LG*>yG{*eDk`vJDb3m6}UyI2& z3jPIPF-<=MiY3He8ldl|={dm`SARv|{(5=xve@(^AZY{+0xvB9PYG&EafdcBa{;km zEa-&symQKX&c7zN=N6Ru*tS(nxdTw15g?yvfB^BHD}UHsI=9urcS6Xg%w6D}jE-YS zuogxMz>+KBBcjRyfPnxANgJRnxpnw}Xm2OQaaf9XJuH-1jNZ2xWb1Q-IM9VTq~1B5 zAS7f0o3qF^$~6^wAPdJw?uBQWvn6b0>i0PR67=-Y`(CjS<~YP=ObC~i7dfR$uYmOt z4tH5zu*3T&$!}IL>G8@9d8BbIyiPw5#){l zwqdLU5$=!5(6a?y8X$HMmVg}q(2tP_ViT9QSHd4ay+fRMFVOk{;O}|nq+m^BI=n>z z)fGSl)5q|=0eCT^`5^JSy8v`qHao*Gtg)Zk9Di-_{bZ-=3gD>o2fz>vKLA$3(SbV+ z3hk4U)vp9zV5Ih^Jrtbi3dylNS*P(gQM#ooQl^QiTjH&Iz(#EAgZ6j2wTxY7pL2=WPl zx__t{;0NBKG_m-;G(vo_f!;Mc0C#yePzh0F>H(1PUhFSmyUS6L#f}LNag3>Mglx6i z0d%0J^%LX`x2xQ5|{(Ah8mox9!Z%de&cBIA{QXsIT_h@1HAR z-|4lB2O#RiYQ7c9h_G&^zXl@ywM!7pI>`6pHRDVdvebvv48dn?u@HYzC zITfGEuw|i)Pj@tJgdJZx^iT?0$GK=zuz_x;TG`_=g&x(S6Kx~E_adr1@(icQ&m zn)9TRZbk!-Rex=Vb35mhqVgub&umuZt#Z!8SbrZ_WymvDE7KCToe1zLbdZ43rd`n@ zK>T6V0pNH59z+che`xbIt9h2!d_W_=hRL}DBT}AC(TEOctE06z=VfZUK{^`}W*WyDc862uF?yMKdS_toxKzia}(eVzOnz~di= zk)U1pcw6-TxSOl_8$iCdEd)6=YQ7)U<3*K-V{vkPYE+&?0rl^iUJ$23oEq&X5k1s? z+tIh43vo=0RzwfA@3*pK|-56%qEKKFfbEAPLq0ni**g34$9 zx`4d@V}Hfgzdd($&hjzdcKd5W4L_xuTRWsm1|N2E&c0l_85B6^wEjKOXo--MXRQPh z{>`AE zsq8$w23-WdVP^l63%Kkb4KCs46-OPYJPdoNb$82+kYhj2k;5kQvsO0LAnfV+6qEZX+1KMFcIuVO^8Vpr@R$iizH5TdVuaC>L>5o=rln6kzs$a;IXLHmHPagnhG3E=paRo+_x zFn`J&R&Elb2}z5Pzr6e9R(Tz?8E+0pE+J>u`5WJ`Y|ExdWedQ%@k-UYHyl|hp7M$S zXbVatRzbDK@4XB(k6X~D4?S$lN*pdhJq{!IFM|<0ABrKMWtU$ARe~BViC`L}oiE{M zeB)<5%eA)I60jFuDZ^*eU}QsqU@8o1xqqav1ogu@$)-5{2)-qxgW20=mbzhYG(Q=t zP_Ra+Hk}5+=kjm>8UDo&=b{(_XEs3xMG2rU;s5DKzflMkShpfOT@!Tl#%~wDQ~4Vl^ZNCZDg29`4*N9E8mWo zsn0R=wAKL*=Ll~Iq$TE4tOYE}Il_=KEVCMNaZ%-eV_szwTU0?e%_0t;AB;CNz?%YUZqqS~)S4Vp@xH zV#Snu2nYy4F)3nFO74po_U0H`N;&4$%>V!Z=TjZ60005&NklP#jDd3ePysapWZ^$UJvLIJ4%JeR%nCIa) z1N@h&R>Q0g0e`zc_rO2(4x|efEgfPPz%5r0AyS>f)1b| z3;_UiNWr%?Yyr>?B#=%}*9D?4P`{op5?vig0J;XyMe&z`)LeHpZ3N&>W+1q2-?I`l zQHVbRX8s6>;h*^vzz(2}VFIi~>&pG&VIYqYC?Kh?pnu(V0N@lb@K->XMiATZ9R=#| zF(&}P@C<-0poK&JmO?#@W*N)?m{0WRUwmr9dI0Dh6n~#W0i=ZtpmRVN#TJ}fau?`% z7ovX&ht>Fg=e;X!4CjD>q95c`AFZqMS+Kdf)j7AN2QC+1U&Qgb{6M(8U+?qwZSx%< zG=8*z&`klheE&#l0c<{+CW4UOSRN!-2IQ4T@uvr=0&IF^0XBq3&7lH_YzgEa;sGE< ia6|(5=%bJRh<*Ut+#v*>`b^;f0000s}D=1x7P~5+>k%M~d=GqPb000nlQchF<|NsC0|NsC0|NsC0|NsBZA+nSJ00DhT zL_t(oh3%H>Zi6rkg=;%BMRJ<=f7{v4g-gO|}>(;GX*AS@& z{D6qyZoriRbRJ;iL*Ue}04h4jA~a(K*pG;ghJg%Tw5j4(bBv`3-;q=-#AFDf`a=cq9z{n|KTmFbn~lXXc>< zJPHUQ3rTOm{|XZC}JC23DS}GEkKK&0p^bpaxJ>?+5kls zhPeRbU?*IZ)f`j&etz!(MDlu8wE9;w;EJCzKpvuber*e4RZG^MDg4m_n9;T;HIMu-YP()S3!2pJ$((`5ds_=zgOMp6JVY6N@FJf{dy0kR+n q^_Kv+0MPm){#wQY82JMGD}4c|!x~iXThx&N0000V!ZRFMq)0009uNkl zh|VKY#S+8UTF^umA#m4uCs- z2(ZvOwg`S*O0QlAgx{9Z{PzgBe%h!J@t_pF!q0sh1qLGlPb2Bbv+^qUkybud6m zY3)F@8~(&Kb>vP9%&%RUw^{_1%pS!gF)oNe>g6ph>iD2!fpT2Tgs82)*Mcdu38JEp zM*yMQ9YCxWsDETPiE&@N3osFgzP>4bcL3c0xPnzRWd4QE7{QNPLII|JFUsLHpabA1 zElt3xpsH4q8y_sh*Lxh-sdW)4lthu#pUn0=RLnUb91Q_jBXc+zz0#6n9G_CGi^k=q zrMw30Jts#1-3IItkf@yjbRQ6cJfF||Daa5fX|?i`=zq{g)B!X9GXQt#ARGbl4PcNO z1t^-qb69TWo%w?>SSdcnQ6_dRAgg~$TPmewEM$Dw-~&=AzFdEmEN6Eefw*m3!Y7Y_ zKxe?Zt|I`=&Mp?*5yX-onMzB6s6W>TIj;EY1kg8thFF#aK(s)~`hE-nH9tpbT1P8F~RT&xBe%@oumQ>9F zg@WwIF0j3bJQHz%-o8IX)vG#a5;ilPpj(!gkbhc}z5>)7eCDX_?Yfs%KwHXIfS7IOd1 z0fPCn#^VWrePg-+!e+)*cCoj}31Dxt5zyWpx`Wv3_Z&ceFiioSAi7)5-c)R7jOWvb zD}XxSIDJ#E=eTCg)=E(uIBd-6wJQ~&h+uz$CNx~$K>&@k300000NkvXXu0mjf D0)nV% delta 814 zcmV+}1JV4q2gL@EB!4haOjJdg)1|Ysv)S3%^78VEii%A#CX{Ge0001HJuJhLd-ano z`|>s}D=1x7P~5+>k%M|SPY5*t000nlQchF<|NsC0|NsC0|NsC0|NsBZA+nSJ00Oj0 zL_t(oh3%H$-hJ zU;vr_fPVtmRO^}m>FYboLK_(X()VpTlnkIAFrP~gupa{KmwgYwyXO)>6I+Y8+@{Le zuLdB!xC=vUD2v-7~)1B_#R0&sEP_W@uu zh;9H_mKdi2i&Hgb&Ml~cd(p^WBmq||_Dwj!?0e)z#D8MP#}`>K+K6AWA5i=$&vZ;) zT9XmMS{ZtMm;L#Z$pESZl2z=pe+b6`L=J$hB=EEaTL7=Z);+-<;*OmY;D4T)OLXcV zOXf_#VjV&Jf#6@S0h}xV(4Saq=OUYlWlNyrCwnQ+04EetF098cJs>dv$mTJ&fK&u~Z0cVK&0!`01OV+hfHFTCLiW#ubj09q z2$ES${ypHNl*3V1#9MBYoW(e6;V)D14B+oPKmaUo?ExkMbeCZ$`AYQ#V7-Kt;@c9S z+)(&$z-df*EC~Q_3qY9)kOlSn-~%HO6+n5caDSY8weJA(L|t`65i-_xl0ylABjARt zeFR*5Ix@f+c)$hGXeH`kO9s?LfJek9J&LB4&q3>c)92mJs3{m+P^70^dZbHIZbNg( zQJTq6&t9XKB7TdVsX;&cmrJ$+>bQ;oou&cHJ)p#8hz5WQ-2iS0qYSQc_?rN}wsc^x sFDIn|ptt?;N*e-ZtVg=NK!3M>0S7xM&o0zD=>Px#07*qoM6N<$fkh>GZx^prwCo0M^H%m)TbQEQeijGnrg#0s;aFKQ1&hG<;bI;#R~cctj)^Sa>i_o$-}{fkB`o$S?Rm O8aS)CY0Ac|wTu9lG9|(Q diff --git a/graphics/pokemon/kilowattrel/front.png b/graphics/pokemon/kilowattrel/front.png index 3a8e971644638c9ae20a3a4330afc78b31bbe879..fdb1a38e482218abc0eac631f7dd8bb7b81fa5b2 100755 GIT binary patch delta 24 gcmaFBa*<_%3KwH>kh>GZx^prwCo0-)tbWP}0BvRoN&o-= delta 40 jcmcb}@_=Q6%0xqJDF%U(Aiv=MXyB~krYReY^Z$Q4dH@C+VVthJE}hjT ztv z78uDQ_l}{jj?~*mdI6C1ehAz>4t`xxhSDtuz`@_HBnjVGOM3Id2&X)&&(t^ALOs4k(`Vijl3~(<< zi-!O%j-nGk$uqz>>Kz})?qSP-UC+PB69FG(x%WJgq(?$WK85c$0eH_ZxM&UPy>|zo zm%J~v_Zr@qMxJo$ADf4y@6Mj+*VRIpCfIq!(%j(!N(rEmtZNs5o6mA5K%)SbZn1w( z1pZwi)Ou-uN$z?0@>(S@Ae;sXybm1#yfCZ+0QgD^8)md<(jl+6|Z7of;1{Y2068nC%&p0pt|m zJcddSNoVC7jp+Tp5Hf()K{x>3rPVG@5~ z5Bh?=vW|t1*!>gMr8>IK?h8sAjpcabiDhti!doz=xHga2O$%R=ZV=_Mt$#w0y2Q% zDS)X4P%;7+H1zQjOHBNMQK@J9nSh(jw3-HhP!lj)c*d|IgbJm6zR*TFkK#)~@SL0w z8lZs)K%ZB%%Wg*jGRYT2o|Ah51#wQrk<+1nL~=y~a0lpoN&^>I*Hj$(#dM1#DMPVX zIZp=|srR``>Xn&H06Do5h2NRwT<0nE4%P-sJUr7ODko_L*ts6n5cmL1Dg8VUQ0l2z z<_*#$fTST-<*9g+w^V-ta0zC3YqbfGtNIiKK$6Esy#o(JNd!a;j|0C8AyN;^(JLH( z1vBj_?U1Pp1AEHzc*>`N&B7!5eClkx@BgU%=>kD4{Evvj|3AJ!I4%zaaA*69mRDUm z3?5z})b>C5|M3fimi>R=|J(L|7@*q!u?qy<{tsOs?7ICo%fJPK^j_Nkc|Pp_zy-qD z{+2mB{0u6+kc!!&;Voh zzvuo(?Y{~bw*T7U{=ok0_XmT2_FoHO-2Q8XA^T4il%7bgO1k#{wn*jYI`;n_KsBCj z|C96X67KCkg`gKZknc`a`wx3`%?bo=>_6~-!0_hK2%y^kpMxMR z^sRfc|9fHoBbDm)A=AYNYgDFpG6~NNI9%QTU)ulf{;%yHo)dr&td~0tI{*Lx07*qo IM6N<$g1>V?n6km4hn^Oq zHSB49sGLI&@gW}fkV7f8z0gDV7i>32`?7(ataJBNFtH0g={NMfkz$QTa$GuxSmb|w zdNcDR=6%w%{1KWf0(WtGKM_)=(O4DS3d4|6hp}01n6WyA!9vz>bK_Ku8eJ?{9`H#V zuhRu%EN7X2pEM(61rQ#e9iC9?17PI=AwBjEU(%;tDt6IO0odH}%MSO4!vdvlBa>l^ z9-ka{dYyis7if)H8DLKBvnD^{{XTz8!5S88s0k?bzU_X|x%jM08C$q&p%7^Heti7f zj(yH>5M_o%ojyH({pRfswfh245{zNx&mJGx@KfrISf&c&0D`677=KL0P?;JbMg>@h<794@nU%iQ~)qeagK+a!~88kJWhgl zGO+8t62J%x;dw3IZ3pA!E(Cyu8jgCfMGt{dB}h^n7*VMo!u;@PV zqWgadK$}dHr-iG;Vvq5e{`x08aLgb9Wdyd(4Jbya{o?T1eFmlMm##v2k?|a`*XDDlboCFf+H+baGO%gHqfDK8tqSMQ+@_|c z&HAf$DB(kG-3i{xx^w2yG27?X2fjaDNcwEyRy=U;oVX!SCm*^n0j6u zB4(T{Km6av*6sb_aPHhgKp1-SVzwe2Vi=ouu3=#Pgg-zn7iKmd>jAtEPPR4UNc6zT zHbyO_2f2W(2X=oBkkSKGklW1ti5^g9sg?uHJ<@}V&ruKX?a2T_4_@!ss0WQ()wH1d zgC4vg(ETGlu#`fdXNKP&(eRQ?vDu+!N}-=Dj2zXAPI(~ z2U?;Bi9bkspf&IG00d)MC|M6$OFj5L5e!KWHY7ce{2|eU2Z{Ngz8;t|kf#R{kgo^wDsuFoR!=XJ6cjzk z9OVT?4>Ev7zm)Z$#@tyN&@+1ADs7h#MGxE=G;SHO6g{vSl!kI|*DYBO7=e%90!>Y# zlSB_NMcvWUA4@_ZszMLIF4%2eQzIsL0l^=r!-^#Ku1Ei`=6-d{Tu%P~IsOGpgZ%C* S>!daS0000c0004VQb$4nuFf3k0000mP)t-snar75b6OD* z5&!@Hq`jnbK{@VX2()t;|D-8WF&O{F04W#{N--d;QXpD$T53Tl3~|sn0008>Nkls{a1Chpyq?U|)QGI*2E?|v?SKC$gPI!5)QTdmiKiXa zbvI@&)wQMKrd=Dz+S;9ghL<)|mDXCbTNR8HV29)J27hBJi{^9;DvJ0HCk)gb+ODK7zcZ9vzAn11t8u(b=(@(gmLtyTb4L zbIgV{&xQ$)@pBy0FqQ&DcR|5i5a)^whSFFbUGtDE2s} zj*3E0DggJ*W9NlSJOmO!@uwD0x_lC(?!-7lOMySLp#9Bb z&C3S9WQKVuaHAl!1>*sqXPvS#iL~OYpsrTx8cr_1jR`sfxq;6sSa5QuO9DS8==Kwh zd>=pH9Dn$N4O~@*CZ)$E5@zj@$L%XDn6ybseY2=9&e09|XDidtM&W`TTXAO3*K(FPmrJ z*+AVsJAJvg`&CR4Xt+La_8fhf$1XrbZA_9X|;kc~?7zc;AmBc;+FX^v!4FRe;b+^O!mLl7d(DXTe(ldGk)+Dooo2 zPh-4(KS6;0tAtqwFhrGC2A|&_tAQ2*GL`3!Spn2|d0(R%f)9+5jaUtMk*p(-jxYe_ zz|&i2>R`rMAlm}8mqY2gWny$CY@585eEBR)aLUjP6A07*qoM6N<$g7V;` A@c;k- delta 938 zcmV;b16BO>2DAr|7=Hu<00013M{Ml?001yhOjJdf(4bgwSP&2p`1tsku%K8#DDYqi zpkNUApeRr<82G>dI3N&6Fd%qHD1d-~0001u4e{6j000SaNLh0L01m_e01m_fl`9S# z0009jNklKeI&ecn37(tjUN3ia5*gQ0ZOau$J% ziA5Kq4z8E}4M7AvNQGkXEK5FX zmZh79L5QuJCZ*V4yPy!3B5Aj$fu>6lL0z;g(ekeQ=L%>j!Ie+-pqKPK&mf~;`VVnI zy9&^+RH6W^qkn|g&_L7kyei^(mer)!1%QaFus(KxL$3@#^!sih9|K(1E5{*Fi5xKh z30&^=U+czz4%AfFWyfU|aP#FP%@UA5tws(QCLsBn3Lu1(_l!yEP zTLoaUlmTh^Y%)9BX1j_-YZ1Y_q`jE?EU>p(k|Ym%0DqY?j7b==PxdCsvg}7v(odL< zX&BMuYlaaQz?_wcS4z)@_MrhJ`KWb1{BQ(FmP+TG4@ZX?93G>*0-dkN4^_b7o0kZD zcMz~EfX{hH>O&$3U1eTE%442oJJ82A0I^<^g$6pSbPM^j;do>?Dd*ZC)EPD%zJ>D1 zcx0D>&wl^};?D!`*!bqfoe)Hk5;&PM3HT`j&U6|Y(t)VG03in2 zL7hw{({Lso99simpc2IF{(cgMhM9sxx-QLb43W0wicV(-fR7z- zA_?48ftv&?d^=i5i}8DNCpz9~AXUpd3L^3I_J3E{DF9fB8;%tW$E{#N;P>qx1-zES zoWmkX1I89@996glU?YK(xg!nMBd`x-&Cym&`ue9lG-Q*ADI%y5#-3nS#hzTPYQwop(nJ{m;D7lYVTJ;5;HbuWR|O0X zv47ZCe4_yqbZx+h9T}%Q+m(T`0TZ34TLf0e447R%H&Q%!Tpw)BH(EtDd diff --git a/graphics/pokemon/landorus/normal.pal b/graphics/pokemon/landorus/normal.pal index bbacdca837..36dd9dbac0 100644 --- a/graphics/pokemon/landorus/normal.pal +++ b/graphics/pokemon/landorus/normal.pal @@ -10,10 +10,10 @@ JASC-PAL 184 72 80 160 88 56 240 120 64 -51 51 34 +96 48 16 248 200 96 -51 51 51 +72 40 24 96 64 48 119 51 85 128 128 128 -0 0 0 +128 96 72 diff --git a/graphics/pokemon/landorus/shiny.pal b/graphics/pokemon/landorus/shiny.pal index 25f3ac5c93..c76bc2922b 100644 --- a/graphics/pokemon/landorus/shiny.pal +++ b/graphics/pokemon/landorus/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 112 88 -16 16 16 -248 248 248 -152 176 160 -88 64 40 -240 96 8 -160 96 16 -248 160 40 -80 48 24 -248 192 0 -56 32 16 -72 48 32 -120 72 40 -128 128 128 -0 0 0 +153 204 153 +90 115 90 +17 17 17 +255 255 255 +164 189 164 +115 65 57 +238 98 8 +180 115 24 +255 164 41 +82 49 24 +255 197 0 +41 24 16 +74 49 32 +172 82 32 +90 115 90 +106 65 41 diff --git a/graphics/pokemon/latias/mega/front.png b/graphics/pokemon/latias/mega/front.png index bb513505645aa15202fcb87aa5b5376ac0d3d2c6..491f02fa4b45573254abdaf7dd1cf836755afc21 100644 GIT binary patch delta 828 zcmV-C1H=5!2Z0BW7#0Wv0001;w}I>c0004VQb$4nuFf3kkv=|u0{=-wK~z|UrI%Y` zt1t{iu`C&f{V(|H<+mZ>R{bbVm}6NU33?nB;iwVdcpo9c=JFLF0Q?Prt_!iT-sm|B z0OR`{1Q4`%9qM%ku>ivBb6^!B)&$RztvgLscWPqzEe*RY(eGgRG@&j3){w}f5>2heFBBA1tD zHS1eq08v{3MGs&-A(hdyMK(wp3ODN&0RjO3tpr&yn*LmWw_n0r6yU^-M^2g{0OrFtkOaJOEPK5~#4*^QE^W4Ve$wrghO*!UU+` zL_-Qf0ajIic|*Ve=xyS{7|?S8NMq=I)IB_43$TL_K$s9&5QJd`$XNioUJCP`SOGQobM^rBdfsA3@NJ16VOBdpXDC?-h_0)Dk7)qLvX!U`vkhj-O5nd_ zb`ZrY@NIn=b4vl(e@@8N1I5K|SGbtazex2d2*3z`n0gmxMfg(!=GU;6LOOMV)7(qR zT5)*LtN=Bx4FcXaq+ajMOlgm(eM%0HZM%uZ#yLBIa@r$m4s8@=cMqjDi>zbPhCqcN ztCYmufQ?XZS_xD~cLxxJFzl2-empjM+oaMPLDpA6A#9J}C?f%=rrIWmHLw%z^kpPi zA+%b5^8|P%)R6*>024q7H-I|RKulT_sSLSxzwZep0sEGXfc^l0q3E}SQLhO8_r(j^ z3vLLD{;*dDnLBgOSvBUz%Bn9nFRSg&0`__ZuODh&V`4UG_V;co<_En1Htya7tUe21 zdnc{++5-0*IBv?gCEP3oX|C5T;O2|_-OV=}-hcDG3jY9`Q!UyqF3U;)0000VGd00SsVL_t(Y$Ay)@Zrd;r#uWkDQ(M^$x>kj5 zHWj$&W{XJ*WJ#4U(%PU=w6=|Xp4HOj19Zw(pi^I^eW>1%k}Ua8%E7RGKYjP{?npVf zj_AYbIR{sNK-A%GpQr=N7bjBo zpGo1%2l&MK_)y%D00ivGASHczJOcQ*50IdVxaI)Mubj{K#I?RcUgiXs1DLp0%<%y3p5pN~VB-mlpwA-&ycA%8#${@M z;+j!|v4mJ8&V2+@{CZJH2`dvXO)_`LFaPv8!+v-$g~yAfmB&@Na@ply#)Oz7@C5`c z>UdfC^#yw=gau$4!9sTh9CYFuVt~No6d>yg*fa)kQnUcIM7J)!$$`71wJYE_O%7US zlVMlk2;=d51dT+wB|#>lXjbJ|Wjfq{VhNffV z)9)6@TN_OgUrRha*zD4Czd|^{wWj%bW8>3O7|Nme_22fHr`7_?*JxTVQ|!yRGh91e(wz1VB-pA=gTm zYTY7?1S9zp_kU}~3EOku03Jzyl#0|@p5NoP!&2MJqXHHU04&IHS7FE)+g#15rn8cz zW>W4LD|FeJSP!?Aku1fj&%xHfdUy^J1a#GBT^8M$r-{MZq4l5wf)3!(2oKy)A;V}6 z$^rIo(9M7kxTASUmky&2btKYie%+T7v}*U(mZ${iUl!=3`WGeYGI*_7s~~8;xtooI ztwZQ-gaa)HHJ}>6EgHZL>*qqck9Prd#A=|mqm1pomqOJ70=)~kW$TR_sALb&`oZ)b giOwsVZJBVKe_Q^CQem&%1^@s607*qoM6N<$g461yivR!s diff --git a/graphics/pokemon/latios/mega/front.png b/graphics/pokemon/latios/mega/front.png index cc20e9d1cb9fab62fd5937a24f5a695ef53206b3..ebca8034d8bd89e5f9e01e558aa8218dc97f1615 100644 GIT binary patch delta 828 zcmV-C1H=5!2Z0BW7#0Wv0001;w}I>c0004VQb$4nuFf3kkv=|u0{=-wK~z|UrI%Y` zt1t{iu`C&f{V(|H<+mZ>R{bbVm}6NU33?nB;iwVdcpo9c=JFLF0Q?Prt_!iT-sm|B z0OR`{1Q4`%9qM%ku>ivBb6^!B)&$RztvgLscWPqzEe*RY(eGgRG@&j3){w}f5>2heFBBA1tD zHS1eq08v{3MGs&-A(hdyMK(wp3ODN&0RjO3tpr&yn*LmWw_n0r6yU^-M^2g{0OrFtkOaJOEPK5~#4*^QE^W4Ve$wrghO*!UU+` zL_-Qf0ajIic|*Ve=xyS{7|?S8NMq=I)IB_43$TL_K$s9&5QJd`$XNioUJCP`SOGQobM^rBdfsA3@NJ16VOBdpXDC?-h_0)Dk7)qLvX!U`vkhj-O5nd_ zb`ZrY@NIn=b4vl(e@@8N1I5K|SGbtazex2d2*3z`n0gmxMfg(!=GU;6LOOMV)7(qR zT5)*LtN=Bx4FcXaq+ajMOlgm(eM%0HZM%uZ#yLBIa@r$m4s8@=cMqjDi>zbPhCqcN ztCYmufQ?XZS_xD~cLxxJFzl2-empjM+oaMPLDpA6A#9J}C?f%=rrIWmHLw%z^kpPi zA+%b5^8|P%)R6*>024q7H-I|RKulT_sSLSxzwZep0sEGXfc^l0q3E}SQLhO8_r(j^ z3vLLD{;*dDnLBgOSvBUz%Bn9nFRSg&0`__ZuODh&V`4UG_V;co<_En1Htya7tUe21 zdnc{++5-0*IBv?gCEP3oX|C5T;O2|_-OV=}-hcDG3jY9`Q!UyqF3U;)0000VGd00SsVL_t(Y$Ay)@Zrd;r#uWkDQ(M^$x>kj5 zHWj$&W{XJ*WJ#4U(%PU=w6=|Xp4HOj19Zw(pi^I^eW>1%k}Ua8%E7RGKYjP{?npVf zj_AYbIR{sNK-A%GpQr=N7bjBo zpGo1%2l&MK_)y%D00ivGASHczJOcQ*50IdVxaI)Mubj{K#I?RcUgiXs1DLp0%<%y3p5pN~VB-mlpwA-&ycA%8#${@M z;+j!|v4mJ8&V2+@{CZJH2`dvXO)_`LFaPv8!+v-$g~yAfmB&@Na@ply#)Oz7@C5`c z>UdfC^#yw=gau$4!9sTh9CYFuVt~No6d>yg*fa)kQnUcIM7J)!$$`71wJYE_O%7US zlVMlk2;=d51dT+wB|#>lXjbJ|Wjfq{VhNffV z)9)6@TN_OgUrRha*zD4Czd|^{wWj%bW8>3O7|Nme_22fHr`7_?*JxTVQ|!yRGh91e(wz1VB-pA=gTm zYTY7?1S9zp_kU}~3EOku03Jzyl#0|@p5NoP!&2MJqXHHU04&IHS7FE)+g#15rn8cz zW>W4LD|FeJSP!?Aku1fj&%xHfdUy^J1a#GBT^8M$r-{MZq4l5wf)3!(2oKy)A;V}6 z$^rIo(9M7kxTASUmky&2btKYie%+T7v}*U(mZ${iUl!=3`WGeYGI*_7s~~8;xtooI ztwZQ-gaa)HHJ}>6EgHZL>*qqck9Prd#A=|mqm1pomqOJ70=)~kW$TR_sALb&`oZ)b giOwsVZJBVKe_Q^CQem&%1^@s607*qoM6N<$g461yivR!s diff --git a/graphics/pokemon/magearna/back.png b/graphics/pokemon/magearna/back.png index 17568f8bb23011aa8a1964305d00bebfb33bc7c5..2e3a77c5121415d79935553c11fbb9109e445185 100644 GIT binary patch delta 633 zcmV-<0*3v}1%?HX7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-snbW0ba&qeI z?4G8k(b(9cu&{1|f)Ef8USwpy!orM`ll+>z_)>2SsL9>wwn9%7Cj_PgL~01NhJ)z z9P~wl9G$Rl+unzjyD%C=m*BQ-ZTt=DYg4Ce^$&4``!RAk?F(MTLa)LaPbl7Sr=`jYbKGbU?pb$cu1htc^ z2=hb0Y!^Qr-}wn3)&gKcus*~kT>UhQH-O+804?MTLVrpHul%`>jDV2D%U1xklY^;~ z@HmbT%kJ5{oj?H6?P72X1Q_@U5D(Hb0EU3lPKFA4K$(#h5d2>N^cHr2db9vYAiIaK zS^y6|`3ZoKb=E@<@%iQgsCHqTkH83M{e;K>qkl#)&tQ>_xhK3RfV!ba;JX53TW$!! z)B(z$l5!E%Y8rb;#2#T0gPRBW9Vz4Y1;~fdXM`^&`D^8$5LiBpl!@~D1Sj{AQ2%vO zYI^pcq;!7vBkgjx1gyJ=cli1IBqfAX|4{b;<@d;TMtD8$?O{2MskdP~d0)00J*bL_t(Y$K{l z$ms*rQiD!jBo~>yI6?!oXouiZZ=HG>J2dg>eLCh5nrA2}$&O_+T|1OO0+IUilc6X@ z(SK~C30ObSaVNJku*pprxNrT*Y|gJA1LT=Mi(FoSZ}TPt z7e#xT>m~=A{%C>Dz9&K;*mpz#^!B4j%K*rW!5GGC*?#~+XlhW$AYuWbH_x95U}KJ2 zt&G+iW6XCF0NZk2nJYky`z&P%5=BHxY+1q>ON=>^*J<;US%AGWU#TL;CS{NTpyd^y zW)9$@s-Fm;I;1uObaF)i<6X7o2;iA4%@FvoucRLp!G(F+?TY??tYtf#!aVQy1K@B0 zu$%Q&0Dsf0C}8_{Kx^p%Ndr+NWv=zw14lia8JWY4RaS^sk3=W!zEXHegrR`7@&o`i zH4m`|RLPel5b0K8^+*p)LzHBVIFp`uZ^#sIT!qF;bC_>R;)PNmqm|aNIpDgV0iFkZ z(|BetDieb?zzdXQamhu7YnEia1lVD=C{HK8z&U27Y|+bLUzOLV^ZAt8H!JM{r3F5o m!G5_l&j{cX0>4S%U)mojnPBNov#jy}0000c0004VQb$4nuFf3k0000mP)t-snbV~JdT^9d zAfuTWIby6@gU#jQB%HMW0KvYrdqK^dVi6G$|M`sOy@UVer26{$hgfNR0009ENklr+4^=-wuz!GLAmoQtUmXhoEx-_nN|z2$1qzrfAQ6a2U1orc*N09&1aNPJco70X z>=Ckom~x}v0hFMkj8K3YXfj^=cNVN(5J|7mLZcs9fB-FE0M)~+BJSCTYcf5N#ippC>YVzcdOyBa_tFk&O$v>;i9<1=Q5pdA3{QjYd) z2J8TrQL$T-jfKzwQc`dyHxC;NHhY@Rkh7Z}nwk#=VGLmDS}N4&t*tbt&}0Bjq*CM7 zfUR_zP=BnaBl-6WX!QW?ZW-Soa`^|*y>74hAKXneDMdNm{XqW3x=*OwmWLNZ2I$OA zaxjZda!~hFtnVGXlqlWsMJ`Ajr1~rn(9@mc_v>eOWzN&7Kro+{fbHaEA;^ko4s)^7 z=P6eUnx5%QrE({+w8x&%g_byrG`>*6#7SU&+J9RPEo8m?EY7(_hLHd=5R``piyBOL z36k{%K$+?e_M}`9`I`U>z$+lmD9P!`rUFo>vAmeL1qCR8IKysiNNuASPUq5NvBBs# zq$dAjr~z7jzu$ilq>IUuW4Ut-c_@!n69X<5@b`=mR(>3Q}Uhg3&nHEAyfr~R^Uf1;op$tIQr0R+IEA;cZ3rNwOI*{P&%mDs| zo9_&Pa`d<>kOb$*bF^^w9oYe#E7l9({6lmHSSZO0;2vRKDP{dt+Z^?G0V}m?(+1zd Yf8`ujB=CERy8r+H07*qoM6N<$f~;|#XaE2J delta 781 zcmV+o1M>Wh2bczs7=Hu<00013M{Ml?0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000mP)t-sn9!gQNLUaM5Qu$mrn6*rpHaY;l$RDVdv<&#~C+b|S`6?p^A zFe!N%@Z1<-LI+F)ex3x)0$Q34SRleIBL(ASbo?l?lF*mVd-u|Nb>&QcNCLd-*LV$8-a7xV30Gw7MK@%Y)GIlGKfkGoe^TK$IJWD2)Uo9GIMcHb4Fwn?4rcf><$47NC5CTHeV4*ArLM^Fe>jc;UVn8Shqq}GK&ju;10Mf; zN_X)63V+4y+cZyi@P6t0r~CC5#2DbAc=&B*Uq?EiZp`DIS&sp4Q)A4gFlLs>FnI?+ zi7N#>y_<*o0eDFO*c#)-S|c0004VQb$4nuFf3k0000mP)t-snbV~gOI=by zN~CisgF#BPN?Pu{TIO?$L!-TmgNv-BtPv3r_TGcV#l_y<-un9bF51|{0008_NklZiI$`w3`NTzXo%?l|Lwd4#C=?5(tWBL^<9z>BK`Z_S%2Hg#T|y-%71OwofDYH zab$X+@B9g%$Va+!1pt2nQ27|6={UnK5a$5Xo3Rb(h?qxh)^B}W^a&vlq%js+ePo(S zdPD&jPIS~KBHH`22Z$8?0^mhnE~Ep&6c`YtBx0ijfa(SKL1{~%tf0goWPJsc`E~_R z5xf8l$4GJM8I+3Ro>+Z$H+7lK6S<>y<>cBF)UXH}&YFv8C z$_XU0>$D2#FnxZK@_bwU8X@HIb3T1RSWhI%B}Szu6olR+?^$-!=e404FQYrw5~~c> zw+1tJhqP=eY!0;Uf-FR|%0jjm~$ zcK}5Y2Pe|ttk;S3{bPb?=8Zv4x~4ZmCocebewauHz)W}-08B(rsugf{WW5GRgAE@1{i2wiq delta 992 zcmV<610VeP2I>cp7=Hu<00013M{Ml?0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000mP)t-sn9!iGNLW}vNQi)l$XIaTaESQ$_|VA6sGz725D@6NSfFqy@YsMrpt#`R z;1Ebyj>Ydt00009a7bBm000id000id0mpBsWB>pILrFwIRDVdvg_JR9+dveC&r+At zq1ZG-)4}pNSWW`Q*q}H|pl&jBEJQ=05Qsnug)B1YLWd3=9EZ~27y?yOFzr-i58Xnn ztX*o&Z8L;`7N?7#Lxv0?eRr}PJC>X`NV@yK``_KWXQQ!5+@9cz`QhO`S-2S#ixg0m zVPa+V1}LfueSf8mVPa)jxX~;0n=e&;kVQ-$0KBT!XbMS%U=}<)W2&4wDP2 z8t6a}nu9Y`rK%KRrOq<2S3kf)L4YaM4FgsRECU%TDSv2?1272yjVcQx2FxN)F-Za4 z&oFGjEMV&*kt&4fvoyn~L0}=iIV4!r#|@~3p`grqyNl`CaRY=fAvmM9yY!SrNz(;1 zM(CLUP%|MqLK(GUygr0FifX8i(wdH;3OH?$TN~h6>mg(|HZjJ(vlugjV$iHST#rw1 zn}2E_et&KG{%|SEQ0MrB^wu-_2P~>VAJNVUnr_L%o~PfMl{6?n@$Gn5&ixhqv;-y% z+D99PMo2&u%H{e%Cx%wdBWYVDI>yAH1V+ox>U|w!Xx1$S71FG%ScEMV+}XyCNp&a* zYsEqu3h3V(M~InqE45tO%mm%Uk#(>O?hWHw?tfe_WpQb-5zL7O^m0&l?!CS1z02l$ zomR;V=0w=};9hKJ*Av90Ui+taUhmIwBX?qFU6iZz+RitO!h;hy&)sgfqI8H|uZQjL zk+N;)yq*xf+_sJnJ!3vne_+|&Zg1U+%y8^D#~owNirB-$>m&1Xw_C7ms}%}do$SkN zW`Cz(Th>u1(A<~htBZp<%d+iy7{JN$+Udp10~;(tfhhpa_GR;v6_En~`BIkmo?P1Y z(RCQ`$^k@9CC^N=c@~mn%5i?k@{3gR^k4GiG6aY@4p_uf@#bDK%mBrv+m0MhJdHn2 zC7PkfNLgRv6o7ahrX!9@GYpsw1rP=UcUcDXL<9hhpL20)+QLx)LM0bt%lcZ61o)jh z0Mx*^6LH-GV7@iM0NsawF%wM+)10iMk2{lfBv$SKIFi4Ez#~6Bg#H7)K}BAH5TAzt O0000O$ z%C~Y6ckBp7L^*|{DN;wG$OTpu>7k4eBD7dE7Dw>~as-Z(v41hk*b7EVmBO#H=JU?a zV9=*epFaO4TS-^_VIk>46{ye+@O=i0ufKqZroO(M(>MS&e)C{6hY214`wmNY41tXm z_&frw9+8<)6mnYVbL+GXe4Y7~=xI&1*<+#r17^j|A@l=j zMwx}otHECXpKno76oy_dt UhqWcelK=n!07*qoM6N<$f>6hucmMzZ delta 542 zcmV+(0^$9I1FHm(7=H)@0001;w}I>c001gbOjJdg)1{l7t`(MO#VIp^E#TcR~^n0d1zHcjI4Jh=2Ky5D|R69zA;W=+UEp zrmYjKTMF|>{9U(KMgSCRUc06HXQod^KD0@yaS;+{oB zEd==^VB7XyP!Ji*oKm{;k9G*2ge8U)<4qC+0CL^2kxYty0e~saTYtCakM>f6y9vxM1wHv`^oKTqeGh7ncF%YQsDAl>_5eb{atb g(ZDSq-WLk^0m^?aAL5C9SpWb407*qoM6N<$f=e9qIRF3v diff --git a/graphics/pokemon/naclstack/front.png b/graphics/pokemon/naclstack/front.png index 4055c46cf312d0de578b48afd80040358d2da981..646b29881c1cb6ce7e95847bd2562fef4d9673d7 100644 GIT binary patch delta 538 zcmV+#0_FY31*Zg%7=Hu<00013M{Ml?001yhOjJdj)ufbST4GX4dwYAulzZmY&Be66 z|Ns9|Qc^)NDT{Mr2nY!7ix~Fi7ytkO0002fcYsC!00FW|L_t(|0qv4IPXa*{g$Y}U z)!nQnBo;7&hS&*N3vFg|H6~U*HrB9YG|>vfPU|Z`Y3L@j{C@xojRn1xws!s(?~Jc~ z5r2T3Vv9ZB+&z2l~DP=%J_6*A6{&wb!p3n+J z8XGQ4T%xvszC5Y|9 zqRUvZHIRo@1I$OylP3KRdK##310*&@nx8m)SvSUQO1hcy^$PE;1gH6z3L`9?*IS*07*qoM6N<$f;<%Vc001gbOjJdg)1`57asU7Sw6wGm5)#ITZiiM; z_QRf6EGKJ0JpZ5o|Nj6&797H75INX-<^TWy4s=pZQ~&?}|NsC0|NsC0|NsAJ!ZSqx z00KTqL_t(oh3%H@cET_ShD}2#)q4N8J0Kq=X=2->JKGQ6vwyRx+540Pg4}Ljef7^3 zg4^qYJIpMBcrPTca&Xo@Z%QaZIDaaH%DyRvaU4R9UBsRWMkfGHos&^P@aIJ9k$>8$ z0lXx*jz8~0!}1uAMq#*)UCs?clK1=xs(OU(!@cnfA``lRR4k_K-)150dgwY9|Ks|m6r7yKoB{ARYacz z;@D08AP1(lp7B{zYGAxjlea_VZ@bNL&RFY(~%V%Nk1Thk&+6Z7a6}0CZQT z!JumYP5SLS075C-vO|YFSY7~dZl%>=Sy3ESfHdBu?98o~Ndh;&js+HQJgPIp07PWF h$)Udz(RI&X=m*iDEpX8XK&k)$002ovPDHLkV1is@I)(rM diff --git a/graphics/pokemon/naclstack/normal.pal b/graphics/pokemon/naclstack/normal.pal index 2fd0dd7abd..19fea0383f 100644 --- a/graphics/pokemon/naclstack/normal.pal +++ b/graphics/pokemon/naclstack/normal.pal @@ -1,17 +1,19 @@ JASC-PAL 0100 -14 -153 211 165 -113 113 113 +16 +156 213 164 +148 98 90 +98 82 74 +123 123 123 +197 148 123 +230 213 205 +197 180 189 255 255 255 -180 180 180 -18 18 18 -198 135 110 -135 86 81 -246 195 158 -87 44 39 -107 65 60 -255 160 0 -255 255 0 -66 22 28 -194 103 16 +82 82 82 +65 49 41 +139 115 98 +8 8 8 +238 139 24 +246 230 24 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/naclstack/shiny.pal b/graphics/pokemon/naclstack/shiny.pal index a8f14a01b0..94d60d4731 100644 --- a/graphics/pokemon/naclstack/shiny.pal +++ b/graphics/pokemon/naclstack/shiny.pal @@ -1,17 +1,19 @@ JASC-PAL 0100 -14 -153 211 165 -164 70 47 -235 145 61 -211 94 44 -18 18 18 -198 135 110 -135 86 81 -246 195 158 -87 44 39 -107 65 60 -255 160 0 -255 255 0 -66 22 28 -194 103 16 +16 +156 213 164 +148 98 90 +98 82 74 +123 98 65 +197 148 123 +230 213 205 +197 131 106 +238 189 148 +90 57 49 +65 49 41 +139 115 98 +8 8 8 +238 139 24 +246 230 24 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/orthworm/front.png b/graphics/pokemon/orthworm/front.png index 87535ce92cf1fa4ca5d318bc8f2a9a3f9f3d2a18..14884ce2c7d8946a5f68377bae92be15f1bc8d43 100755 GIT binary patch delta 600 zcmV-e0;m1F1-b>0ZGSjPL_t(oh3%H%a)TfYfEx%{O_le5+a&~4Y_-9EyKC;c?l!;A z5Fqe){NfjffEsscC*i$wHx!u`wtQhP@7&7DSFfS+nGGTEPml2y?}886;BkmnMZ+_! z0yaF2hIaw~0wS;(z=g3f8{Z+|n(O-kNa|M#sDi=J8n|k?7c!mauS|el@Q}jgfQ;7}%!PQ`np5e= zLy2bz?kYxsMt>YyLrlqQ=_nglXG-4Fozvay+;ZlnN2UY4cc)5HhvyWsj3!5vXT zcL$~956_DG@)l8dmI{`o73?k|XKUoC{!g{C`cHFVzlcAjGapiaa@zR-0000X(1b;+U; zfL$O4cgz4L0?fS0Ad032I89U%FbN28KbcW@%F`ek1@M}23#j~%lF7h=`8Ch45``DR zvRG3PoPW6a9p53~n$Hq10FwHZ0;*szYz&>CV&)(nmY<(GxGr7i(BDagZA!;gkxh*HCdou>>&?M4(l4hdcF zF(vzXR14PtWpn5?)NZf_^X}9s5QQdz%uhE2K)x(&=BFDe0FjqzDfl$;f%`7FzD4kk zD50x^Qu2p)#eI2;s4Gha%hC#V7m>3$b}0bMEdtI3uzx%LtSM0GZM}l62DyfO7U0x` z1Gj?t)GLN_L7RdIDyFT&c7UD;koE#7Z|CdBmII4U1#H+9gdzw5eAxAZX%82B1+Fs* zP{u8YVC{s=q%Q(qP&sP z{wKqd+fya4RiLt}C@l+U;wdFje8u+yPFFCJ#7Ry-G~h=AV=AC8wL3G=%G+8mhDMP) o(1WW2DxXKSkFE~9&Hjt{1B31#G%zjfmH+?%07*qoM6N<$f{9EIs{jB1 diff --git a/graphics/pokemon/ponyta/galarian/back.png b/graphics/pokemon/ponyta/galarian/back.png index fe45584312b7bc9a46be9e20725d43d503a84c52..f798d5cb45a3fe010810f1a0441e9d53c31fd7aa 100644 GIT binary patch delta 649 zcmV;40(Sk;1(gMm7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!g|$mlSb zsDR+u$E$ny^vm$uo=8|o5D*YRIHlWD#Ex2TG}{{Z{;6H2;&AC zfS2^J4g#2b4e)+0U+#YrNb?5)+Wm&G&~Sbd5Top(C!PmnNRqJfwtoj8W!ScL1aQ`% zl^|m~Cr)K{kRYrVoq~TKU9k;CR2hZ2e#gkT&wj1I-{|5#sYO0C+L> z0b>L~kU^LL=qMBfEC6GKdVO?IN`Qg)YdMRE&H>ymvV^Aj;5F1zZ51 z0Fi*8sc61#qlMFk_C!?I04HZ11&BN_M}vJ)Mdrd%1~?fPj_&N)Vyll&fNJXj`cEWW z`RM}nrn>|1S-^dzgXnE55GB+CyLB}4CEW8za~95*yoG4sWDPiX03M7EbtRakwA>kl zI6mgR7Jt`#K8jd!73%c}oIg1kmD;7K?o1itcH0~q(44j@Z70XZG+Ee=xP^~I3DSpru% jP<+Ju`s|;wzZoBc9W06z2s3m50000P)Jxv5D*YpAb9Bb@W9x}h@g;Icwhhk z00000`+h_X00009a7bBm000id000id0mpBsWB>pHDoI2^RDVdv&6PiE+dvq`uOfq% z3}=VpF}8!r>S)pEQbh=~>P*%O<;arnpafx5(xIcgD$pu6dJ>HU#( z=jbl9OX&^b;Qjf1p67iJjQ*#y7tGk#IkeVKNisvP##SICgd}L_<+cWt0a@VLfFR%i zA;HPWsIf;#cz@1;`CD^~Q(hA-G9TFhd4A;ijCd+fWg{7hHQd)b+ zU~K{dO6wLR{$x^EP<9C6bI9IX0V*b$EN@>1=JD#I(E~qX)N%F2m_i30UeuuL^7d;7 zC?vp>B(VH^Z;_BPG2E?wS{jHZF~BM}TaYcz{s6f9Yk$BEHJ|`^>cor`k;U-Tozzj= zAuD0?JS1{P2U^UiyKfg`B|*rn1EA|2AVCJAUbq!-snAH}MhzNugYj$eDBg@ZfE?w> z!(yL(uZJ9#<#-1OY1*G+;iB(N51j#Wd|e`Am22FaNWeRB2F`e(o8$m3h159%ysN=@ zssX6b*MB8|9>zMbvrh*2+)bqC&^l1oz!#UO6I34TdG#yJjlesM{rY;Lxui0PBpN)M zX+af04_ZgL9z*%OP&WlEsIpO*fGSjg=D5{x;j#T)R2qPNs2-IAWk)^X?dC@zgQ({x zhz7WU?R^>UI!Gs)$Uc04Z=rC|2&BV_7Q}@OR6cxot=DvjbpUOv?^Qhm%$Lnp!U2r) r*2E1g#1L5pi+WGoZGUqA@F4UXj2(QUp`Ej900000NkvXXu0mjfRYyZH diff --git a/graphics/pokemon/ponyta/galarian/shiny.pal b/graphics/pokemon/ponyta/galarian/shiny.pal index 707eb51faa..62925ea1a8 100644 --- a/graphics/pokemon/ponyta/galarian/shiny.pal +++ b/graphics/pokemon/ponyta/galarian/shiny.pal @@ -2,15 +2,15 @@ JASC-PAL 0100 16 152 208 160 -72 184 120 -16 144 64 -128 248 176 -200 144 48 -248 240 160 -240 200 80 +72 200 232 +48 152 168 +128 224 216 +199 171 123 +247 244 203 +240 219 158 72 88 72 16 16 16 -88 32 120 +64 56 165 232 248 240 192 216 200 136 160 144 diff --git a/graphics/pokemon/rapidash/galarian/back.png b/graphics/pokemon/rapidash/galarian/back.png index df065bf1f0e64a7e0bac64d93f3c115997c86a68..59816614d913fef37169edfa0a2db9adcb8fb1e4 100644 GIT binary patch delta 630 zcmV-+0*U?N1(yYo7#0Wv0001;w}I>c0004VQb$4nuFf3kkvdi~e0luPB64*;H}m&NbhjP3?G=wRCARq5sBOwS6^IlXthZ$hZXF>(cu0YE-O-!yJx8CQa0&KS(fSwl$ zw-X4E1e^lMbM!L-2+~>mq@FL@95K5YBu9sBu2u0TFIi z2bX{Zlzhzj-6esI9rj=gv>iarGXY!@$N-I?jZo$jyZ}H2933j3+pGaT zQYe6+1L(VeNe_?$HlS6|Rv`od2rVEll2Fk9FT(-22-iBn@o>(2lzvPBFaRzEG@dMQ zxT-^NhXOwu$a+VG^QdbR1_k#*0M%at)E->_qNZF`LjzF8=!f^!Q9uB!9zFw%t6&l! z+yf>G0N2B{{X!1wtfcv7h9MJ$&f&s{BIt9eT6~Z&XfBkuV0Wgs&aK0yye7$yV*00013M{Ml?0004VQb$4nuFf3k00004XF*Lt006O%3;baP zkuDg2kRb5z@Zi{h02pBS_|Rx*c*w}mprEh-0000000000TV7D300009a7bBm000id z000id0mpBsWB>pHJ4r-AR7l6w)IE>WFc=5$Af*dabG}>1)Z`0X;&y>0rxc~o8*U)- z2LRnrSRy5Q)QzFTiJ4PXrW;VjwHqo`Rj-|Y_*D2MPVA%wF`l=`zdq03c5Ulvj%SW@ zS$z!K^Uj$c21?kQ_B_UCo);)^XwIKwHbT$q%Fj{Mn70uQgy@|BF%A%~QI@c0%>o#U zc~&Ag3S!Yfln_0}(TM`8$92?PqAI|8Fks(B%_X23^jZ-*S170e_WVn0WP;aO-2r2N z-|PNf8~gYUv<|FC_+o1;!X^+`9WJ2o{pBZP9}~!s>X5=>QM|l8%rsyF$ zKhE^CP64tq!hk?Qrr+ppd@wpx8TmZS&*_hm_IK)#3Jd@UOs6ir+r7EbBdClC6aetm z-7|21Bx9c!V4Q)C2GR*CTR;)5g6F-w5?V^MZmnm`=|{P9sK-!5;y`ZwF;zQ0P%B>8AA^C zEA6l(=o?@=se%39z<OoKG7{GH|fFBkEg$A~N1Go_)DGb1_KLhkb4N?Jr1|@LV z)#ND;`Z99LG2V#DW4A?njoma z6-(K*^wE)^P8oV8NJ^0W8_0`=!s9|glTO*9~S o=-@3o6?J+0n; z<0ueCjYWcx-O~U6?c~P3Sgx9Rn25&RWrxi@B&)djc>G_A;qnXhlgrN-qTa9w<7+*s ztrmhT5ugP>ItMWVTb3T-eU@)p0Q?>xccMd7fE}c2l4EiE4qI-iCLp3A>=G`d5b&!& zpA(`X*oF{Nyn={-`T_wh0ZM`kA;d8Qjz6USSTh6+2m!D)Tq;0%Uku2Yu+;>Q%8mYS zmh_<<&<%zmY$d>OZ)v?b*82+ZnP4^-%*N|A4D`~A1pxIs1&>|e_5*;a0W^{wAQOxW z2(a*aIg&dqRR|+O1UQ`b-I$kq?Xd)&m8KK35ZvAr>H}fCs#Q{<-&`=kv{kFeFR?4}1e`9`(=nse~Q?&mNHG!Flh2^v8jOaR@5_>YW5| z9AF`aP@NDKwkg2Txbp~H3_y9?3GD75fH;pd0q^(wkLa;31L&xOD924Y1#tWDdS9%E zOmGUoFK8Km#U3a!1LP2f>$(p4!~_{fuu1<^HR!=t&w_B`tP+6$Opw_&@@&`u(!tjP z3KYW)ZwCda9w0ZzgfTz}CL{txeN~AFD}WN{Yo)JCnN$E=qtknzy~CqgL|PLAtnGiVECASZ%-;h_;_H_BYhCmLr*wkDS+yn ziwGTABxx9Kpx^01)wJ$Y6pkN+_(*3d1lQ|_B@?i9PlTPM_|dtG`dYxjdr*Sf2>E>}1iZcK3KXT)~Iy z@vTgHnLk}u-xStaPeR7OMnfz6Ig7qzaat~s!j&To2vjq;3F^idWZ6J zjjAQ7gpdfhc<{#Pb&Ha`+u;gN((5PyG|t}WXayLZ5K_(9BN6EDakvP8<1h-qYTZ_F ze7&Jx&g1ZhXb&tdh(3Tj(q`y)lJgmj2!C*YQGyn_Oe&$*U#HJ=3k->b1mK^jj_&|~ z122RWnf8Oc{r96g1l|>Y z?%RJL51s74Lig~|{ueQXXnB!gR1Y8Re~w@i51ovf+oLI8+y6{}=%Kglp&uiHoe%~d z`kwtyW#FOj+5e;;dFWgAKk8c#EpsvqVQ@*Ddgz;kg@^uN|5e}Iu1XL6!Tu*e@1gUm zx)DP3&?h|-)d45#c_)O2K99MmhtA%Ab#DLXgbJ{*|HUvsLY(5EOZWU4;A8+#(c5wm zKiU66ACrn!9Pk$aSKcnfr(f%n1B$1 z&F=e#{YOMjKokfu&kOsXp-?0s5+b_qsr|3=2Soy+WH4Z5|BL)VPC#UWG_hd{}00000NkvXXu0mjfylt*O delta 1455 zcmV;g1yK633-1e%7zqRe0000$E@3%FRo{z1YCPzEAw`pycvg_SYngkN>ZVNU! z#2y`en6>5u*aZdRQz(>vg3wa%cL;^#;FDu&O4RpeB<<+Wno=nA&<8fVJ3qboqbGm8 zpQimAQ8A3EtHzD%jm9nGit$FnG#ibHM5QrfLzsDjKxoxAX0Sypr9@whn-FBcG?j=~ zIv|>+aK8imBf17P5LCK441*tg>pL*IoQp7|+dKq1kLiH{{voc)b(@g<;UII1KXqX+!pGaVS zJjarlqq1=D$&4BJat4U098l}lEaL{{Y&ixNQ$WsfBd9sgyL{B?biNkA+*D=})d4k* zf1(ha$IBc8I7gSt@EKW=8O*s9uo2j&d_)Lktr6@;#m&XEPG{q||&)sf@FB4lA$UIyr~FHUDKkDOLA zhvj^v0#)Ar<=5ZBrVT(}gX6Xqr!zp0k)Qv(JR-KkVGhr<>?z&Cx;8Bd5LerXj$AnZ z7HqU>+KU>jacQ0)8{cr9;CX-8PK%G=4BZMm8S^eyVOkM_vh79A2>{nE+rb0UJxc{( z4ggrwUY?N$h;^C+?3+L=H*DL9fATC9fVBg_8O$=3{*(bsoWu8h(o6xH*Hdxg+ZZfd|o96upn4t_1GDv)ba1?W9oFqXt@Ogbb{4TmY z4#OUW-Q6cxJL$dLf^T)Q{zDjs_rqiO!rK~bfu(oy{SbGoll6ZvJeGh9KtBaG&VGl2 z$F%@KNKXLz&dyFU1$h^7SsFTY4J`(~fBQB8^o?_+bZ~aON%ziQri;|o;zi&PpG8-_ zDhmvE&L@n?e1|`toViyKP4M5O(@L=Qxy{ku#L zv`qgl(F0BC-(Hy>XxaW<&;u>szw>&a<@YxZv!Wh|lZ5{L?VAw#H!JFa2zY2A zpntQX9>^4L5P<&8ih3ZoL6CUu_@qP+FnS|+dAw*kat(iZJrModg;xXi?{c6gURSWR zY3>#EKok920ykS;K@XI=0s!t-UJr6WQ4hvZ$KLFf>46F~C+Y!I4FYVk9sq!TFj)_@ z8uo5ZCh9>YZtifP<$53i&;vG656r)<2TTF<&G>Uh50du<{TJ6aL_;dQj>QSv@HAhm0PS`hy#Y|NY^g#9vgYxo$K$5Q6{!002ov JPDHLkV1l}ju0;R< diff --git a/graphics/pokemon/salamence/mega/front.png b/graphics/pokemon/salamence/mega/front.png index bec9a9254923bbd63430a73dfdd70bfa90ed29da..44812fa0580a958ab66c00fd37441e1432d4ee08 100644 GIT binary patch delta 915 zcmV;E18n@x2-pXZ7#0Wv0001;w}I>c0004VQb$4nuFf3kkv=|u16D~yK~z|U)tBp* zs~`-8OEHP8R(=1so$Le%WPXSF|4LWnU=Y9A6Wg7uJley7R287HsnGyATR(**i?wA1~b0NTLpemme?a62uM}!i%K^O!N ziynx0hY%4RJ54=*1CBN6j3c6V;z)?nIB-Hx#697lKP9vSIHlAk!hk)2?g-GU={zEX z%&Hf~{hpuz39i=HV*))Qx&?HEV5xsTRc?Cmc)|z5KG74WFhM`1M&A=gKqaVtRv#h~ z0DYow0h|;N>GfjBIooGK1~3XYgcrZGsu@WzH!P9A0hqvltQC`c&=Rg3YdD03{3QT+6d~wiR6^%M48H)Vp4|ZjM4G<^ zAZkJ-YB2yntqU=hYI$BIk+GI-F_~T!1`u)mM}WPb-r)_sUR45TfD^)VjKBfDC!p-2 zUm1at5qunf-9}JSR5uqR0Fbzh)D&GhFq&6f@S^mQ;Z%PGa6(9xV6Em0ed~fv@VWd3 z;3bm*Hb+BOzt>|*3SqW`=&mESwqPo($2wrq2TD*oB2M+ovaaNMBaq&&lybl65N970 zkZ)CwvRYU5VBW1DG$J{bFRl;x9)TPWvNjb2Ok)#&=A5s5Ubd{)_Npz~^XP z2`$tB$xl`9FItZJLI}P<1%w$=7VHDrUG>L&1+MB#4xOzvt(%~`Fx$%kb3Fk5BJ)23 zQgwk%uWi#h7RtjvA~d74sBPL<;c4phbF*!zBs_z8MW(L=+O|!{C-PX0w+w)!JFtYD zB(HLRDIFjaaVGd00XBarjh&0{W&pcLutTH%e z!k1~Wr>pmxwdw=57SLV~ey*8Yd%_z7;B4Fgj6tss zfX&wdVZ2+fI$O4gd?^#8|Gh0f4Y~jVdI9t{j+lzZh{}2Ej*Z? zjG%@5h5HIl%I?fh<$x)|roUb1=a+_MlAX?Cwg>412ueNi_9Y}+@R==UZh(#;Kfjdk zAH(Me&L$ZF;l0%KD-eLS_97L3U@T(Ha_}#LjbNO{J_x%l&W2Y?0Q4D5`X)i1U>sgQ zh!^vvyLZfn3kh(kFk(kF#JwaD&?xOsr|cPXDdQh*7ia8C$Z9Rf%&77mx{8Kl4uj0sPFyitG#5>)s? zN${}*-lAuq@4dm<$aTLhX&lB+8{yfgtgvGe0J zD70`&)wdVQtNtsMv$Hzx*P>6SoeTJ90HOsc(bJ%XIL{mN12Lhra{)%}>1PSJ01Q?@ z=j;m%JZzaVYKIEY4-XGna|`<{9 diff --git a/graphics/pokemon/shroodle/back.png b/graphics/pokemon/shroodle/back.png index ffecfe183c738a176f30d48dacffa35e38eb815b..3bb3cb4a581cbcd32eb4acc66e0ebb92f172a360 100755 GIT binary patch delta 81 zcmV-X0IvU%1A_yQBt`*qQb$4nuFf3k0000mP)t-sn9!hod3NmU=nxPPtfrYyXmvp2R#sCDb6mC&YEeg#`%_5ij1H5D*a9u%g4kC&RwB$g^RH`$lZxy-8q?;6BX?@)(9{H0B36mOaK4? delta 39 hcmey%)WbYMWul>tq(DiKU+{l4a8_~Cl#N-!i~zUY7$g7y diff --git a/graphics/pokemon/shroodle/shiny.pal b/graphics/pokemon/shroodle/shiny.pal index bb3f9a6a7d..67046e31cf 100755 --- a/graphics/pokemon/shroodle/shiny.pal +++ b/graphics/pokemon/shroodle/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -96 88 88 -232 236 200 +125 121 118 +236 235 232 16 16 16 -176 168 136 -64 76 104 -72 60 56 +172 166 153 +79 104 117 +72 68 65 48 36 40 -128 156 168 -168 168 224 -96 108 136 +187 210 227 +173 114 205 +128 149 168 248 252 248 -208 200 248 +225 171 233 184 176 184 -160 112 224 +225 52 239 0 0 0 diff --git a/graphics/pokemon/spidops/front.png b/graphics/pokemon/spidops/front.png index 944a9110703b59239fd9f6a4158f98c9ce3c0131..d6bfb05623f29b943304159461107219c224c0ef 100644 GIT binary patch delta 696 zcmV;p0!RIz2L1(*7#0Wv0001;w}I>c0004VQb$4nuFf3kks&^R0(?nCK~z|U?UvE9 z!XOMp8zhEatp5Ms-fVyZTH20%H8VP+u*XdZsnhg}UwjipbWQJW?h=8#^Zp{iU$)>p zUnQId5N#BlPFv7y5$_1p@f1Mi_xpVVan6DW6}^VM5sm>8$jx(>yAV2p0uBiZm^IvN z6a{pG6Baaq*Wa9f!Ud5qw+ay-w+PZ0)eK&*m&*TMPUcw}fZ{^j0+2eD27my>0Nlz$ z;4M9Jtq3dPngVrlkxx1Fj%+o-$=b+@sNa!5v?EV?7Kxf45a<>=LJtEznh=Xy=Cj_8 zhB<1me%6;F^i6MYd_02K!r=H;eL*mD0DyF*0%UahrmqcuuLw~Eu40S?K+YZ9p}y-a zR)FdVu1U)YK(rj9eAWHxRKK$7#s5jD*BS)Hhq^9E&fLk$**i+pWUX76hFHb;58jdk!z*JlmEcK~F)eW22L ziIlO>OZGRY9{KXLNEQ;|;K7E+ zcMHfC7PEkE*AcZ3z`-{=vW4Wps=N@GGw_zjugCQ$m~Fju3VM|%BgtE zrnyr`561RklKc45+t5*R0Un`e~)&ThJ)@pyi z52G~^G*|<~VX`KJya*sPt<58y7j#NUur*p@Y}ztJ~x z=(qSFmy-3SfFIMuI%FTi2%(rrS#|Gt#byR30p_wh)W?Y8T$WIsliNmmyC#1@>1ksa z?wu=Qn<aC)0azoE=F?o{ic1psa?95u6>A=NsyC#cPw z-E4fPdY$mXgf9Y~c?BDfry96_7$m?Me7j-%ozkQGhiVBh8L*OAcPbm$vBcCVBA2lvht`UqU8%n6A`m;{MVY7`E_MRbZdC%Xi4Z#aohXY^ z-NIs(ejI4q&33ze^qfFmsG*-db$e++sehlxwVR><6fFH_Y^b5e7zy*+R z4z)Q}>q*t*0zRDps)kXi0a}0lel+c000DMK}|sb0I`mI`%#mTdp>^wxk*GpR9J=W zmg|m#AP|Ke2WBj4-~VxUE`V-ZODsQ{?0S+Kn)W+$7!e$XOPBtIpqC#z9lmY=W52QZjftYTU+$#q; zroEPBc!F6%@PscDD7~xr;J`VUObpRF`W}CDU|al>&k6C{ldq{MbZG7vu}yI zb+ytfUxhB&P|8xKCKl~I6{|`ytOh4e7u-MSo5P7?VLw?6+2Pc&vY%{@@cHTJ5qeHn sjnMUq@_Oq#=g{?rGqjffrAvQDKaOA&h;chPo&W#<07*qoM6N<$f^S#r(*OVf delta 627 zcmV-(0*w8>1iA%~7-Iwj00013M{Ml?000McNliru=K~KD9|x5PZ3qAW02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(7j6e*ghuOGiZir3doG0005rNkl!d5@h;6&-TT z)XC8uqC*!q_YK;^k;)22WkObbCqbu*_?W9oy|Jie%f!%usX~IqD=Qmg@)@|-5C~4- z286osZ1($mpZAaNjL?hzlROs?Hl7>sh!c48L?CnnZ5KeIf5%$@;E_Q9Xn5_1O#tY5 zq&NL0!Gab5=rmCXF5cWo7U;w+LU{KBxP)^+i*qi7;5;Us$l|qjeX*)EXduKV9t8m1 z3-@)A8e_DvOd*7=HXDbqGP(JwrxLt3n+~rEU2IOnYM|JigWun;GL_D+K`o1va^9%L zrxr?V4AdUGe+B$Lw3Vk-YOafQRV0#9%=k@>KBO044i(fGZlpRFYF+a}A)7`QxPrAHzB$i)~M<3sr?-sCe%IJLqe}s~Y$>cKA@3(`c@`TzI*9`ox zc000DMK}|sb0I`mI`%#mTdp>^wFiAu~R9J=W zmfNy}APhx~XdpEI|Gg)nwdLYypwovl!+zDZ3=xCNGBY#tUjmwM=v6c5z$d-F9R0jo z*KZ6N?YxK8KzK&^veEvlO2M z?_tJ72d_Kf)*u2bW-%X+e(j|jfv&y~a7K>{%I$n7_#9^nV1Y=h;PN%30$kq1W-3?& zE<2C<1v*DQd^-~^PX@&Lktc)Eu!2keN`N(UGFQj{b!KK}ew{yk1rVnz{m``l0000< KMNUMnLSTaMRGQcT delta 481 zcmV<70UrLf1F8g&7-Iwj00013M{Ml?000McNliru=K~HE7$LNEW#s?>02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(7j6e*ghuOGiZir3doG0003_NklH%bibpKI$0Jgl|SJkH*0D@oDo5w-MD9bwwkoJ09yg%4N zrqKbg>S1)~u(RqrBe!j93lP>iW74jL6{w%h`Lz%)mKLEf21>_bY|%XFh>Z{eah!4* zuXKl686d94bHF_{9h8p65Qrq8_ANox01!7rfa`@$)Nwh=ArOE88pIs@K(2>90=h>B z@R*z17z`qVtTTXqCE_u_x<}&#c*K;!yub1JAVS9VcMcAqSAN%a7=a%ffafQ3s=r%5 XmjaK4oR^ph00000NkvXXu0mjfuk*q> diff --git a/graphics/pokemon/wattrel/front.png b/graphics/pokemon/wattrel/front.png index 72981aa44e918cfb83114d326639dbc6a7d22f26..c2527bab8b7ff61611573acdafce86c0c1a610f3 100755 GIT binary patch delta 419 zcmV;U0bKs^1ndKl7#Roy0001;w}I>c000DMK}|sb0I`mI`%#mTdp>^wXGugsR9J=W z)!S~vAP@x50QPW)|NqK&lssK@?K6s=!dB_|sIKi*ilP6F9b(G|Tx|Zw`%IF@m zB`AGmOXvd_!|yx5A;5VYr`ZA&7&xIwuy#YhVVu)ANI3n@2na4l*MOZ(K$JM(IMWt@ z5Q3vuN@?>p0FL9WmD_)@E+`8cWAwGAQI`5iQI}(Soj$G*$!bFtZ+gFBc3Mc*%dfcA z^XS{@KZO7zxpaWMNr3t#f7e^Tk25DQ&;+Uvpr0;N0DLXCz+XTU-W^gu0PpXBQpQY- zz|+eLvIyR^<3(}(?LrvfAu0*Abl?`u>_Qu&*0Bh`(r3XVkDY(W8Fyf&&;Le`QO|b) zbA2Ho-C9L}2=n!BR0%5;oLZLvA*9x)$+@f&aA+4MWHn_;2o4tm-U@a$0om7nnJiP} z+w_odYun#SkqNwlJR_C?K9nPm8=@n^tqW|lEA=tI^53N=PoDgJz5wfb6aE_8R;~a5 N002ovPDHLkV1j|XzXSjP delta 553 zcmV+^0@nTP1Mviq7-Iwj00013M{Ml?000McNliru=K~HE6*U_H&(#0`02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(7j6e*ghuOGiZir3doG0004%NklpAZcc6DBsjG3U5X&h zU1pI!vi*N~@7*Pmw66bIs;Z{v7~?b{YXGvFVz7l-9g9H*f8N*et{4dTExCAQL`=#6k7K5H^m2#(IaP7KJr1&ZZq~Gg5jx;flh;84RTFN=M$yK`!S2cR! z=Nmhw2@UYbZ1RPdH5)p{2f&)#1`Vu3e&_+H^A-ib$_G%_c);ttv3zQpI{zeIX9jsN zjThyC>LOtEf8J&QZcAPr^8=iA4CKtw3P9aiFbe{|>fFPBqh=C+7V3sU=!XFSomD=$ z#MiiN07smS`^JE5h1k?J^(># zpU{VfB5_$p7BVJt8uD|+ij6TQl;2_rBt#^_TT`)ZJ0dA9OE4ayXWLR-cPIjg3`lu! r=eBs=mqp+i47uZf^+}J{^{49_v!|#+h#uE(00000NkvXXu0mjf=7s1r diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 8880d3584d..a59dd88fe2 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -1765,7 +1765,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .trainerOffset = 0, .frontPic = gMonFrontPic_Naclstack, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 2, + .frontPicYOffset = 9, .frontAnimFrames = sAnims_Naclstack, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Naclstack, @@ -1818,12 +1818,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .trainerOffset = 0, .frontPic = gMonFrontPic_Garganacl, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 1, + .frontPicYOffset = 5, .frontAnimFrames = sAnims_Garganacl, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Garganacl, .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 2, + .backPicYOffset = 14, //.backAnimId = BACK_ANIM_NONE, .palette = gMonPalette_Garganacl, .shinyPalette = gMonShinyPalette_Garganacl, From 77148f83a6b67c1874e80eb5793a52579a015da0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 21 Aug 2024 09:57:28 -0400 Subject: [PATCH 121/225] DoBattleIntro state documentation (#5231) * DoBattleIntro state documentation * Removed unused state * Update src/battle_main.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Fixed state jumps * BattleStruct state uses enum * Renamed state enums --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle.h | 26 ++++++++++++- src/battle_main.c | 95 +++++++++++++++++++++++------------------------ 2 files changed, 71 insertions(+), 50 deletions(-) diff --git a/include/battle.h b/include/battle.h index 6d81bc146e..084c09f789 100644 --- a/include/battle.h +++ b/include/battle.h @@ -607,6 +607,30 @@ struct BattleVideo { }; #endif +enum BattleIntroStates +{ + BATTLE_INTRO_STATE_GET_MON_DATA, + BATTLE_INTRO_STATE_LOOP_BATTLER_DATA, + BATTLE_INTRO_STATE_PREPARE_BG_SLIDE, + BATTLE_INTRO_STATE_WAIT_FOR_BG_SLIDE, + BATTLE_INTRO_STATE_DRAW_SPRITES, + BATTLE_INTRO_STATE_DRAW_PARTY_SUMMARY, + BATTLE_INTRO_STATE_WAIT_FOR_PARTY_SUMMARY, + BATTLE_INTRO_STATE_INTRO_TEXT, + BATTLE_INTRO_STATE_WAIT_FOR_INTRO_TEXT, + BATTLE_INTRO_STATE_TRAINER_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_TRAINER_1_SEND_OUT_ANIM, + BATTLE_INTRO_STATE_TRAINER_2_SEND_OUT_ANIM, + BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM, + BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT, + BATTLE_INTRO_STATE_PRINT_PLAYER_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_PRINT_PLAYER_1_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_PRINT_PLAYER_2_SEND_OUT_TEXT, + BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS +}; + struct BattleStruct { u8 turnEffectsTracker; @@ -726,7 +750,7 @@ struct BattleStruct struct BattleGimmickData gimmick; const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; - u8 introState; + enum BattleIntroStates introState:8; 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 diff --git a/src/battle_main.c b/src/battle_main.c index e0ab912e4f..72b2f0838a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3425,26 +3425,25 @@ static void DoBattleIntro(void) { s32 i; u32 battler; - u8 *state = &gBattleStruct->introState; - switch (*state) + switch (gBattleStruct->introState) { - case 0: // Get Data of all battlers. + case BATTLE_INTRO_STATE_GET_MON_DATA: battler = gBattleCommunication[1]; BtlController_EmitGetMonData(battler, BUFFER_A, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(battler); - (*state)++; + gBattleStruct->introState++; break; - case 1: // Loop through all battlers. + case BATTLE_INTRO_STATE_LOOP_BATTLER_DATA: if (!gBattleControllerExecFlags) { if (++gBattleCommunication[1] == gBattlersCount) - (*state)++; + gBattleStruct->introState++; else - *state = 0; + gBattleStruct->introState = BATTLE_INTRO_STATE_GET_MON_DATA; } break; - case 2: // Start graphical intro slide. + case BATTLE_INTRO_STATE_PREPARE_BG_SLIDE: if (!gBattleControllerExecFlags) { battler = GetBattlerAtPosition(0); @@ -3452,14 +3451,14 @@ static void DoBattleIntro(void) MarkBattlerForControllerExec(battler); gBattleCommunication[0] = 0; gBattleCommunication[1] = 0; - (*state)++; + gBattleStruct->introState++; } break; - case 3: // Wait for intro slide. + case BATTLE_INTRO_STATE_WAIT_FOR_BG_SLIDE: if (!gBattleControllerExecFlags) - (*state)++; + gBattleStruct->introState++; break; - case 4: // Copy battler data gotten in cases 0 and 1. Draw trainer/mon sprite. + case BATTLE_INTRO_STATE_DRAW_SPRITES: for (battler = 0; battler < gBattlersCount; battler++) { if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerSide(battler) == B_SIDE_PLAYER) @@ -3539,17 +3538,17 @@ static void DoBattleIntro(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - (*state)++; + gBattleStruct->introState++; } else // Skip party summary since it is a wild battle. { if (B_FAST_INTRO == TRUE) - *state = 7; // Don't wait for sprite, print message at the same time. + gBattleStruct->introState = BATTLE_INTRO_STATE_INTRO_TEXT; // Don't wait for sprite, print message at the same time. else - *state = 6; // Wait for sprite to load. + gBattleStruct->introState++; // Wait for sprite to load. } break; - case 5: // draw party summary in trainer battles + case BATTLE_INTRO_STATE_DRAW_PARTY_SUMMARY: if (!gBattleControllerExecFlags) { struct HpAndStatus hpStatus[PARTY_SIZE]; @@ -3592,48 +3591,48 @@ static void DoBattleIntro(void) BtlController_EmitDrawPartyStatusSummary(battler, BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(battler); - (*state)++; + gBattleStruct->introState++; } break; - case 6: // wait for previous action to complete + case BATTLE_INTRO_STATE_WAIT_FOR_PARTY_SUMMARY: if (!gBattleControllerExecFlags) - (*state)++; + gBattleStruct->introState++; break; - case 7: // print battle intro message + case BATTLE_INTRO_STATE_INTRO_TEXT: if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { PrepareStringBattle(STRINGID_INTROMSG, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); - (*state)++; + gBattleStruct->introState++; } break; - case 8: // wait for intro message to be printed + case BATTLE_INTRO_STATE_WAIT_FOR_INTRO_TEXT: if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - (*state)++; + gBattleStruct->introState++; } else { if (B_FAST_INTRO == TRUE) - *state = 15; // Wait for text to be printed. + gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; else - *state = 14; // Wait for text and sprite. + gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM; } } break; - case 9: // print opponent sends out + case BATTLE_INTRO_STATE_TRAINER_SEND_OUT_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); else PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); - (*state)++; + gBattleStruct->introState++; break; - case 10: // wait for opponent sends out text + case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_SEND_OUT_TEXT: if (!gBattleControllerExecFlags) - (*state)++; + gBattleStruct->introState++; break; - case 11: // first opponent's mon send out animation + case BATTLE_INTRO_STATE_TRAINER_1_SEND_OUT_ANIM: if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else @@ -3641,11 +3640,9 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, BUFFER_A); MarkBattlerForControllerExec(battler); - (*state)++; + gBattleStruct->introState++; break; - case 12: // nothing - (*state)++; - case 13: // second opponent's mon send out + case BATTLE_INTRO_STATE_TRAINER_2_SEND_OUT_ANIM: if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) @@ -3658,19 +3655,19 @@ static void DoBattleIntro(void) } if (B_FAST_INTRO == TRUE && !(gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_LINK))) - *state = 15; // Print at the same time as trainer sends out second mon. + gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; // Print at the same time as trainer sends out second mon. else - (*state)++; + gBattleStruct->introState++; break; - case 14: // wait for opponent 2 send out + case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM: if (!gBattleControllerExecFlags) - (*state)++; + gBattleStruct->introState++; break; - case 15: // wait for wild battle message + case BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT: if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) - (*state)++; + gBattleStruct->introState++; break; - case 16: // print player sends out + case BATTLE_INTRO_STATE_PRINT_PLAYER_SEND_OUT_TEXT: if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) @@ -3689,9 +3686,9 @@ static void DoBattleIntro(void) PrepareStringBattle(STRINGID_INTROSENDOUT, battler); } - (*state)++; + gBattleStruct->introState++; break; - case 17: // wait for player send out message + case BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT: if (!(gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleControllerExecFlags)) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) @@ -3700,10 +3697,10 @@ static void DoBattleIntro(void) battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (!IsBattlerMarkedForControllerExec(battler)) - (*state)++; + gBattleStruct->introState++; } break; - case 18: // player 1 send out + case BATTLE_INTRO_STATE_PRINT_PLAYER_1_SEND_OUT_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else @@ -3711,9 +3708,9 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, BUFFER_A); MarkBattlerForControllerExec(battler); - (*state)++; + gBattleStruct->introState++; break; - case 19: // player 2 send out + case BATTLE_INTRO_STATE_PRINT_PLAYER_2_SEND_OUT_TEXT: if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)) @@ -3724,9 +3721,9 @@ static void DoBattleIntro(void) BtlController_EmitIntroTrainerBallThrow(battler, BUFFER_A); MarkBattlerForControllerExec(battler); } - (*state)++; + gBattleStruct->introState++; break; - case 20: // set dex and battle vars + case BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS: if (!gBattleControllerExecFlags) { for (battler = 0; battler < gBattlersCount; battler++) From 5a320f94d247310b05c8278f54c49c4cf927ac3b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:43:57 +0200 Subject: [PATCH 122/225] Fixes Hyperspace Fury softlock (#5237) Fixes #5236 --- data/battle_scripts_1.s | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 083143bdf2..5bd91f8df5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -928,19 +928,10 @@ BattleScript_BothCanNoLongerEscape:: return BattleScript_EffectHyperspaceFury:: - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHyperspaceFuryUnbound + jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit jumpifspecies BS_ATTACKER, SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt goto BattleScript_PokemonCantUseTheMove -BattleScript_EffectHyperspaceFuryUnbound:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - pause B_WAIT_TIME_LONG - ppreduce - seteffectprimary MOVE_EFFECT_FEINT - goto BattleScript_HitFromCritCalc - BattleScript_ButHoopaCantUseIt: printstring STRINGID_BUTHOOPACANTUSEIT waitmessage B_WAIT_TIME_LONG From 4cc193ebf1e839f9a14aa36a2d6a8056adf8e1b0 Mon Sep 17 00:00:00 2001 From: Cafei <46283144+Cafeei@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:38:09 +0400 Subject: [PATCH 123/225] A bunch of fixes for follower Pokemon sprites (#5241) --- graphics/pokemon/archen/overworld.png | Bin 737 -> 627 bytes graphics/pokemon/archeops/overworld.png | Bin 1063 -> 983 bytes .../basculin/blue_striped/overworld.png | Bin 682 -> 654 bytes graphics/pokemon/blitzle/overworld.png | Bin 623 -> 641 bytes graphics/pokemon/blitzle/overworld_normal.pal | 2 +- graphics/pokemon/blitzle/overworld_shiny.pal | 2 +- graphics/pokemon/crustle/overworld_normal.pal | 4 ++-- graphics/pokemon/crustle/overworld_shiny.pal | 6 +++--- graphics/pokemon/dwebble/overworld.png | Bin 526 -> 506 bytes graphics/pokemon/escavalier/overworld.png | Bin 1279 -> 1286 bytes .../pokemon/excadrill/overworld_shiny.pal | 2 +- graphics/pokemon/krokorok/overworld.png | Bin 885 -> 826 bytes graphics/pokemon/krookodile/overworld.png | Bin 985 -> 852 bytes .../pokemon/krookodile/overworld_normal.pal | 4 ++-- .../pokemon/krookodile/overworld_shiny.pal | 4 ++-- graphics/pokemon/lillipup/overworld_shiny.pal | 6 +++--- .../pokemon/sawsbuck/summer/overworld.png | Bin 677 -> 721 bytes graphics/pokemon/serperior/overworld.png | Bin 1101 -> 1076 bytes .../pokemon/serperior/overworld_normal.pal | 14 ++++++------ .../pokemon/serperior/overworld_shiny.pal | 12 +++++------ graphics/pokemon/servine/overworld.png | Bin 582 -> 621 bytes graphics/pokemon/servine/overworld_normal.pal | 6 +++--- graphics/pokemon/servine/overworld_shiny.pal | 12 +++++------ graphics/pokemon/sigilyph/overworld.png | Bin 786 -> 713 bytes .../pokemon/sigilyph/overworld_normal.pal | 10 ++++----- graphics/pokemon/sigilyph/overworld_shiny.pal | 20 +++++++++--------- graphics/pokemon/snivy/overworld.png | Bin 623 -> 562 bytes graphics/pokemon/swoobat/overworld.png | Bin 831 -> 830 bytes graphics/pokemon/swoobat/overworld_shiny.pal | 12 +++++------ graphics/pokemon/throh/overworld.png | Bin 1071 -> 871 bytes graphics/pokemon/throh/overworld_normal.pal | 2 +- graphics/pokemon/tranquill/overworld.png | Bin 768 -> 828 bytes .../pokemon/tranquill/overworld_normal.pal | 4 ++-- .../pokemon/tranquill/overworld_shiny.pal | 10 ++++----- graphics/pokemon/venipede/overworld.png | Bin 616 -> 645 bytes .../pokemon/venipede/overworld_normal.pal | 4 ++-- graphics/pokemon/venipede/overworld_shiny.pal | 18 ++++++++-------- graphics/pokemon/vulpix/overworld.png | Bin 818 -> 739 bytes graphics/pokemon/woobat/overworld.png | Bin 530 -> 565 bytes graphics/pokemon/woobat/overworld_shiny.pal | 4 ++-- .../zamazenta/crowned_shield/overworld.png | Bin 1166 -> 1166 bytes graphics/pokemon/zebstrika/overworld.png | Bin 983 -> 926 bytes .../pokemon/zebstrika/overworld_normal.pal | 6 +++--- .../pokemon/zebstrika/overworld_shiny.pal | 6 +++--- 44 files changed, 85 insertions(+), 85 deletions(-) diff --git a/graphics/pokemon/archen/overworld.png b/graphics/pokemon/archen/overworld.png index e25f19ba7f21e34f53caac0b73e23d7585997d05..6dce497d6d3a5830a522b00cdda7cdedc69019f6 100644 GIT binary patch delta 568 zcmV-80>}N~1@i=u7#0Wv0001UMu)cm0004VQb$4nuFf3kkv=ki0sTotK~z|U?Uuok z>>vn5MFRNn|NnQuBt1O|n5yo@+eoUiIUpBAlTwx~TefW3vSrJbEn8L!xP8Ihs=3sU z@mKMPn_H^ziSG%9PpaSnTaV^BCK!=;rtpcsCrEuB@L6D5;sg^j9SXzMpZH-?H?*Cq z@)0(NLtz%5Vsv?bOf3t3;;#%1nHgIqV2-~iKx|#p_s;RF&gq;P8fs_ zh2B8xQIx^;9XP1(j0c8!yg9`2u8>g4>kkDEPTnPqv1d^0p>z%QcudHF!w&8{=y#0K zcn3Y+9pW8-v>djyJ83Mi41pSq=dVKdv3H4QxEwg1VJpG!nJNkppCJGp4kh`c8NIOt z*{8~9Z{o0v9%n6Cpq!^OYl1f#JU+g~JRW9WQYC9+GG9CAxx=n<@}bJnsj|X69-`~} zjcZHhYsa=p6Nl69BXk%%#ZP}_r1Z%j^Z0_!9G3kT5BmXVuN1c}wVGd00KryL_t(Y$L&;2Z__{!UDraEe5#|6N<}PkKUW7Yd9CnLvYo zL9!*vgcz?U99^_#XXS^hvm`sM&a}`+Iqb@Pn^JmwvWD8uB_Ut}lZ{HH5;SNu8f_LX z!SJF}dWtGJymXlCwayw9`+Y%9U`51lSMy5;EpssPX&~u^`09~vkF7BKGN#T4alM|O zkXO3*uCO|3V?-%(Y@lC!ap}+Yiz@?v_ipMR58ZWv$)iyaz5Kpx*}VA{MC~9BSG?|d zyn+a diff --git a/graphics/pokemon/archeops/overworld.png b/graphics/pokemon/archeops/overworld.png index 8a8a23a4edf76796cc9f60309c83f8d5dafdbdb4..6d8faa6597a22dedaab3857e7c9e9db3e8232bfd 100644 GIT binary patch delta 922 zcmV;L17-ZD2-gRY7#0Wv0001UMu)cm0004VQb$4nuFf3kks&sJUP(kjR9J=WSnYD- zAPfx12yFTNpZ8YaU<{&Z&bf~tWjd2KuxNKBWYfpvXZ-u&+`AK>#oryyPYFzCK8e3Q zoTtT{SZE~RMpvB=Y~ne53vY6ICwVR=vKTO>*l*+3bsfHo!BoH@d<$JCJ6JH&k;R$$pDFF4;$>$A!Sm;k;3h*&X0EN?G{3Y?a z2aczxg)mUA9pS`Rhu^~Y0y6(De;|d-kjPwtgvQ|@Lwp~d91e;b<_`SR;R#+hP!?_| zuiCz_gi89Z^PrxRP_PA{?}7qVhe*R;Dgf~jUQlD(f={^w_%@!Do_qGH$I7~JkgEBZ5m^Zs*!+)qUOo(@(RMC*Z zV&T)_*gLH8wLg@>g@Nnv;c&RG|B62Z4EVE43Qze%K;D-VB)IV*@4Zxq#g8?PHbXE^ ze~5WJqux_>m?n7e)-o9IwM&Y1{5t{8p-54)<0)!?95%WPW5tGc8RCXnLxJNeV201t z6KKHKE~%-JXuL@j0im2NoHenQK)}B14;g(P@gw?^4<5ZLy7Hjv`uypzjgMIY=`S7r z*(DGA-B{zN0?dn*ff8un_p$ztC#~Z}8!;{H%qMN@u!+Y4#pjOM;cJ&X`p;P7MZq&~ z)_ie)ct0E-tnY?BngI>mIP(z@-vB^1a-Pmk= zb7O1q{f#ZxkP0ySd|5KSC3OVS_`cWPnVoNWa%d@cE-ye4!`qK{ojQ?)@0@kG^-VUGafHRqeYt&Ph092>KhHJ8m?XxQv+*)+Y zAJrp|_d`}<$Jv^1Ab5Po_ult?cSi#7{|{&z1LxuRy-~B@HF!V#eu1a@{?V!;aO8ho z&DA*iRz8Jq$wj>~ANAN*_rXt!Ao)e&RO8`5;!DW_+ji^i>a|^8JqyQj&WkMd@4(SC zdwq-l(SB3jE~TbAY`fAC8pt^)OQxrH;5%uO`Cu-F`>jYghtn-ny(AEh41uj=x^V|S zOp~))0>Sd;`OSDJbAOA|O4yZS&O5il&^!P|D zyAm%QD;zpEYt!Dv+*(1a(V!BrHZji6jS@|AH{QvD18-K%fb9m(j!C_#@xp(x!fT@( zACn7J(83ABq3Te6bJQ^eoYsUDj@WG6tO)klReHj5!LWeCc8(clWL6QvDc>`!OD9S( zAk;ImbJ~n?hiulA30xE6G)Sjn;5gxq@l5GcN=S!#72(oJ>RUX4NmB|SdiiM%fE@BF zldb79A}h=Z0?Z@yL{mB5=Z=462b}h`+u;ITDimRM_48{h;t8mxAU=1P!;$L36L#US zyd@LZbAwKw;z&}~mJ7%I3a?GBqmD;tHxxZV(;+_nQ?HOp!0BDKRSJ&_!`;dNC-9x$ z>EJiJV&Hfo;5telenM&AL4p&V;rJ}{X6h&^O2qqhLkvay=IejDswICe{Gs>7SKSfc zx#A^MI&k0CJI_$e~2*Jama`eIYy>XwT2Rr_F Z;y?5OTMg diff --git a/graphics/pokemon/basculin/blue_striped/overworld.png b/graphics/pokemon/basculin/blue_striped/overworld.png index b8f0a345838b41119688d4484ba889fa38f43ff5..b900662eaf1bb01d1d1b1c3062386a681999c7bf 100644 GIT binary patch delta 594 zcmV-Y0#V?!Ilty{Nl{ZEP)BS=4&xTAGMe0UYC zB2pjjgw9AkJqbMk!#zV|=K@;wQYXU!44Fo{71p>6FKuDl?5a>}3@! zQm|P(-q$B=kyZXBuluurz0P- z{ET5R?>QH)42Sq~o)U+@@~4!R`Cr`R$86R1HrT4!Ot^7>;C8RYycgnzM;V7qHe3C` z(P+ape|Z`#!~Ea4$-fmb*mf9%zb0P?1swQ!0l03eDu-n<1$^;_F=bnT7(|ocFN?up z0S9glD_G*ULAC}Rj`lTbdR6~tg9olM1;QX6QiHM)2l>}rTfk3)Y#ZQltS&FNzWkd4 zj(kuc)`u^D%!rH{=pg@^_gBn1<2-19%dxz8)D9%F20b3AR$0Hw`nB3$3XjV^mmCtt zW{sGzQLm1BY-|%bNhWq#D g{MM~oxBfBx0oE8CVDvQL=Kufz07*qoM6N<$f<444X#fBK delta 622 zcmV-!0+IcW1*!#*7zqRe0002CwraMKE;D~YNkl(J%niavB#KN^RzWuCb5qK^+6*Njl)6x=>69sEtzlSqXn? z7#MHT0iVBfP&}ke8(e571U?1#6hqW6h4sb#J zFcFyUXdz@*?%mwG_|4+I6~{K4cTp3{{N<%!@BEerjOXHjH#+43AHKx__<~*28|Ebe zOOE%^4rB8&ehy`xQ6d6PZk@XGdXAHT_fahp0l+(32xndfTWmUKQ~WL#E*XCz@g