From d88834dd586eef503bb677f9425f5876cfb6a05b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 7 Aug 2024 13:42:18 -0400 Subject: [PATCH 01/34] Backported OBJ_EVENT_GFX_SPECIES macro from Expansion --- data/maps/DesertRuins/map.json | 2 +- data/maps/IslandCave/map.json | 2 +- include/constants/event_objects.h | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/data/maps/DesertRuins/map.json b/data/maps/DesertRuins/map.json index 80c8f6a483..be0a28481a 100644 --- a/data/maps/DesertRuins/map.json +++ b/data/maps/DesertRuins/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "graphics_id": "OBJ_EVENT_GFX_MON_BASE+SPECIES_REGIROCK", + "graphics_id": "OBJ_EVENT_GFX_SPECIES(REGIROCK)", "x": 8, "y": 7, "elevation": 3, diff --git a/data/maps/IslandCave/map.json b/data/maps/IslandCave/map.json index c6204ff1c5..142ec122d6 100644 --- a/data/maps/IslandCave/map.json +++ b/data/maps/IslandCave/map.json @@ -15,7 +15,7 @@ "connections": 0, "object_events": [ { - "graphics_id": "OBJ_EVENT_GFX_MON_BASE+SPECIES_REGICE", + "graphics_id": "OBJ_EVENT_GFX_SPECIES(REGICE)", "x": 8, "y": 7, "elevation": 3, diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index dc4fdf8870..4eaa82b75d 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -280,6 +280,9 @@ #define OBJ_EVENT_GFX_SPECIES_BITS 11 #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. +#define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE) + #define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE) #define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS) From e6e2285c441ba0b3965365f7a9f7c1919ea53d9c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 11 Aug 2024 14:50:38 -0400 Subject: [PATCH 02/34] Added OBJ_EVENT_GFX_SPECIES_SHINY --- include/constants/event_objects.h | 1 + include/constants/species.h | 2 ++ include/data.h | 1 - src/event_object_movement.c | 8 ++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 4eaa82b75d..2e7ec7939f 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -282,6 +282,7 @@ // Used to call a specific species' follower graphics. Useful for static encounters. #define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE) +#define OBJ_EVENT_GFX_SPECIES_SHINY(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) #define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE) #define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS) diff --git a/include/constants/species.h b/include/constants/species.h index ec60c142ed..e6b6120a4f 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -419,6 +419,8 @@ #define NUM_SPECIES SPECIES_EGG +#define SPECIES_SHINY_TAG 500 + #define SPECIES_UNOWN_B (NUM_SPECIES + 1) #define SPECIES_UNOWN_C (SPECIES_UNOWN_B + 1) #define SPECIES_UNOWN_D (SPECIES_UNOWN_B + 2) diff --git a/include/data.h b/include/data.h index 99b695d72f..ef11242801 100644 --- a/include/data.h +++ b/include/data.h @@ -3,7 +3,6 @@ #include "constants/moves.h" -#define SPECIES_SHINY_TAG 500 #define N_FOLLOWER_HAPPY_MESSAGES 31 #define N_FOLLOWER_NEUTRAL_MESSAGES 14 #define N_FOLLOWER_SAD_MESSAGES 3 diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 77aee61fc0..a19d7a5169 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1672,6 +1672,12 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, objectEvent->graphicsId, NULL); #endif + if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) + { + objectEvent->shiny = TRUE; + objectEvent->graphicsId -= SPECIES_SHINY_TAG; + } + spriteId = CreateSprite(spriteTemplate, 0, 0, 0); if (spriteId == MAX_SPRITES) { @@ -2749,6 +2755,8 @@ const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId) if (graphicsId >= OBJ_EVENT_GFX_VARS && graphicsId <= OBJ_EVENT_GFX_VAR_F) graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS); + if (graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG) + graphicsId -= SPECIES_SHINY_TAG; // graphicsId may contain mon form info if (graphicsId > OBJ_EVENT_GFX_SPECIES_MASK) { form = graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS; From 839cf2e79012e0fc9159af5ab9e6a497e86bbfa4 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 1 Sep 2024 15:31:12 -0400 Subject: [PATCH 03/34] feat: static OW pokemon now bob while walking in place (per `OW_MON_BOBBING`) --- include/constants/event_objects.h | 3 +++ src/event_object_movement.c | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 2e7ec7939f..9c9c1c75e2 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -287,6 +287,9 @@ #define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE) #define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS) +// Whether Object Event is an OW pokemon +#define IS_OW_MON_OBJ(obj) ((obj)->graphicsId >= OBJ_EVENT_GFX_MON_BASE) + // If true, follower pokemon will bob up and down // during their idle & walking animations #define OW_MON_BOBBING TRUE diff --git a/src/event_object_movement.c b/src/event_object_movement.c index a19d7a5169..ea8a6b97a9 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1416,7 +1416,7 @@ static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *tem objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->graphicsId = PackGraphicsId(template); SetObjectEventDynamicGraphicsId(objectEvent); - if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE) { + if (IS_OW_MON_OBJ(objectEvent)) { if (template->script && template->script[0] == 0x7d) objectEvent->shiny = T1_READ_16(&template->script[2]) >> 15; else if (template->trainerRange_berryTreeId) @@ -1715,7 +1715,7 @@ static u16 PackGraphicsId(const struct ObjectEventTemplate *template) { u32 form = 0; // set form based on template's script, // if first command is bufferspeciesname - if (graphicsId >= OBJ_EVENT_GFX_MON_BASE) { + if (IS_OW_MON_OBJ(template)) { if (template->script && template->script[0] == 0x7d) { form = T1_READ_16(&template->script[2]); form = (form >> 10) & 0x1F; @@ -5300,7 +5300,7 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S // Animate entering pokeball ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL); - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; // movement action sets state to 0 return TRUE; } @@ -5317,7 +5317,7 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S #else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { #endif - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; if (sprite->sTypeFuncId) // restore nonzero state sprite->sTypeFuncId = 1; } else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) { @@ -5334,11 +5334,11 @@ bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Spri // walk in place ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); sprite->sTypeFuncId = 1; - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; return TRUE; } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; } else if (OW_MON_BOBBING == TRUE && (sprite->data[3] & 7) == 2) sprite->y2 ^= -1; UpdateFollowerTransformEffect(objectEvent, sprite); @@ -5377,7 +5377,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri } MoveObjectEventToMapCoords(objectEvent, targetX, targetY); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; if (OW_MON_BOBBING == TRUE) sprite->y2 = 0; @@ -5429,7 +5429,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri sprite->y2 = -1; } #endif - objectEvent->singleMovementActive = 1; + objectEvent->singleMovementActive = TRUE; sprite->sTypeFuncId = 2; return TRUE; } @@ -5611,6 +5611,14 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) sprite->sTypeFuncId = 0; + // similar to FollowablePlayerMovement_Idle + else if ( + OW_MON_BOBBING == TRUE + && IS_OW_MON_OBJ(objectEvent) + && (sprite->data[3] & 7) == 2) + { + sprite->y2 ^= 1; + } return FALSE; } From 42d9f24c8472a67d742d9d9da106480c84514336 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:15:29 -0400 Subject: [PATCH 04/34] feat: added `OW_MON_WANDER_WALK` config option --- include/constants/event_objects.h | 3 + include/event_object_movement.h | 4 +- .../object_events/movement_type_func_tables.h | 6 +- src/event_object_movement.c | 61 +++++++++---------- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 9c9c1c75e2..a6963d6247 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -293,6 +293,9 @@ // If true, follower pokemon will bob up and down // during their idle & walking animations #define OW_MON_BOBBING TRUE +// If true, OW pokemon with `MOVEMENT_TYPE_WANDER*` +// will walk-in-place in between steps +#define OW_MON_WANDER_WALK TRUE // If true, adds a small amount of overhead // to OW code so that large (48x48, 64x64) OWs diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 7bd697875b..ab62ae2987 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -295,7 +295,7 @@ u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step3(struct ObjectEvent *, struct Sprite *); +u8 MovementType_Wander_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step6(struct ObjectEvent *, struct Sprite *); @@ -318,14 +318,12 @@ u8 MovementType_LookAround_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *, struct Sprite *); diff --git a/src/data/object_events/movement_type_func_tables.h b/src/data/object_events/movement_type_func_tables.h index 749c14969c..35180f5b3c 100755 --- a/src/data/object_events/movement_type_func_tables.h +++ b/src/data/object_events/movement_type_func_tables.h @@ -2,7 +2,7 @@ u8 (*const gMovementTypeFuncs_WanderAround[])(struct ObjectEvent *, struct Sprit MovementType_WanderAround_Step0, MovementType_WanderAround_Step1, MovementType_WanderAround_Step2, - MovementType_WanderAround_Step3, + MovementType_Wander_Step3, MovementType_WanderAround_Step4, MovementType_WanderAround_Step5, MovementType_WanderAround_Step6, @@ -36,7 +36,7 @@ u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct ObjectEvent *, struct Sp MovementType_WanderUpAndDown_Step0, MovementType_WanderUpAndDown_Step1, MovementType_WanderUpAndDown_Step2, - MovementType_WanderUpAndDown_Step3, + MovementType_Wander_Step3, MovementType_WanderUpAndDown_Step4, MovementType_WanderUpAndDown_Step5, MovementType_WanderUpAndDown_Step6, @@ -48,7 +48,7 @@ u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct ObjectEvent *, struct MovementType_WanderLeftAndRight_Step0, MovementType_WanderLeftAndRight_Step1, MovementType_WanderLeftAndRight_Step2, - MovementType_WanderLeftAndRight_Step3, + MovementType_Wander_Step3, MovementType_WanderLeftAndRight_Step4, MovementType_WanderLeftAndRight_Step5, MovementType_WanderLeftAndRight_Step6, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index ea8a6b97a9..4f2cc94ea7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -103,6 +103,7 @@ static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); +static bool32 UpdateMonMoveInPlace(struct ObjectEvent *, struct Sprite *); static void SetMovementDelay(struct Sprite *, s16); static bool8 WaitForMovementDelay(struct Sprite *); static u8 GetCollisionInDirection(struct ObjectEvent *, u8); @@ -3436,12 +3437,20 @@ bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sp return TRUE; } -bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// common; used by all MovementType_Wander*_Step3 +bool8 MovementType_Wander_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (WaitForMovementDelay(sprite)) { + // resets a mid-movement sprite + ClearObjectEventMovement(objectEvent, sprite); sprite->sTypeFuncId = 4; return TRUE; + } else if ( + OW_MON_WANDER_WALK == TRUE + && IS_OW_MON_OBJ(objectEvent)) + { + UpdateMonMoveInPlace(objectEvent, sprite); } return FALSE; } @@ -3768,16 +3777,6 @@ bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct return TRUE; } -bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; @@ -3836,16 +3835,6 @@ bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, str return TRUE; } -bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction; @@ -5328,19 +5317,27 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S return FALSE; } -bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ +// single function for updating an OW mon's walk-in-place movements +static bool32 UpdateMonMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!objectEvent->singleMovementActive) { // walk in place - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - objectEvent->singleMovementActive = TRUE; - return TRUE; + ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); + objectEvent->singleMovementActive = TRUE; + return TRUE; } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action objectEvent->singleMovementActive = FALSE; } else if (OW_MON_BOBBING == TRUE && (sprite->data[3] & 7) == 2) sprite->y2 ^= -1; + return FALSE; +} + +bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + if (UpdateMonMoveInPlace(objectEvent, sprite)) { + sprite->sTypeFuncId = 1; + return TRUE; + } UpdateFollowerTransformEffect(objectEvent, sprite); return FALSE; } @@ -5611,7 +5608,7 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) sprite->sTypeFuncId = 0; - // similar to FollowablePlayerMovement_Idle + // similar to UpdateMonMoveInPlace else if ( OW_MON_BOBBING == TRUE && IS_OW_MON_OBJ(objectEvent) @@ -10058,14 +10055,16 @@ static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite) static void SetMovementDelay(struct Sprite *sprite, s16 timer) { - sprite->data[3] = timer; + sprite->data[3] = timer; // kept for legacy reasons + sprite->data[7] = timer; // actual timer } static bool8 WaitForMovementDelay(struct Sprite *sprite) { - if (--sprite->data[3] == 0) + if (--sprite->data[7] == 0) { + sprite->data[3] = 0; // reset animation timer return TRUE; - else + } else return FALSE; } From 60803cdba9fc1b6030e454bd3a88adc158da046a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 9 Sep 2024 13:58:23 -0300 Subject: [PATCH 05/34] Fixed braces style --- src/event_object_movement.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index a4f74c3251..c290456284 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1328,7 +1328,8 @@ static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *tem objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->graphicsId = PackGraphicsId(template); SetObjectEventDynamicGraphicsId(objectEvent); - if (IS_OW_MON_OBJ(objectEvent)) { + if (IS_OW_MON_OBJ(objectEvent)) + { if (template->script && template->script[0] == 0x7d) objectEvent->shiny = T1_READ_16(&template->script[2]) >> 15; else if (template->trainerRange_berryTreeId) @@ -1531,11 +1532,13 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid, // Load, then free, in order to avoid displaying garbage data // before sprite's `sheetTileStart` is repointed tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); - if (oldTiles) { + if (oldTiles) + { FieldEffectFreeTilesIfUnused(oldTiles); // We weren't able to load the sheet; // retry (after having freed), and set sprite to invisible until done - if (tileStart <= 0) { + if (tileStart <= 0) + { if (sprite) sprite->invisible = TRUE; tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan); @@ -1648,7 +1651,8 @@ static u16 PackGraphicsId(const struct ObjectEventTemplate *template) u32 form = 0; // set form based on template's script, // if first command is bufferspeciesname - if (IS_OW_MON_OBJ(template)) { + if (IS_OW_MON_OBJ(template)) + { if (template->script && template->script[0] == 0x7d) { form = T1_READ_16(&template->script[2]); @@ -5353,23 +5357,31 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S } // single function for updating an OW mon's walk-in-place movements -static bool32 UpdateMonMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (!objectEvent->singleMovementActive) { +static bool32 UpdateMonMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (!objectEvent->singleMovementActive) + { // walk in place ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); objectEvent->singleMovementActive = TRUE; return TRUE; - } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { + } + else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) + { // finish movement action objectEvent->singleMovementActive = FALSE; - } else if (OW_FOLLOWERS_BOBBING == TRUE && (sprite->data[3] & 7) == 2) + } + else if (OW_FOLLOWERS_BOBBING == TRUE && (sprite->data[3] & 7) == 2) + { sprite->y2 ^= -1; + } return FALSE; } bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { - if (UpdateMonMoveInPlace(objectEvent, sprite)) { + if (UpdateMonMoveInPlace(objectEvent, sprite)) + { sprite->sTypeFuncId = 1; return TRUE; } @@ -10154,11 +10166,12 @@ static void SetMovementDelay(struct Sprite *sprite, s16 timer) static bool8 WaitForMovementDelay(struct Sprite *sprite) { - if (--sprite->data[7] == 0) { + if (--sprite->data[7] == 0) + { sprite->data[3] = 0; // reset animation timer return TRUE; - } else - return FALSE; + } + return FALSE; } void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex) From 5d8c61d8137a68762993d738ba94d889dcde01eb Mon Sep 17 00:00:00 2001 From: Liamjd14 Date: Thu, 12 Sep 2024 17:55:30 +0100 Subject: [PATCH 06/34] Pokemon follower changes for issue #5135 (#5336) --- .../pokemon/arcanine/hisuian/overworld.png | Bin 1178 -> 1058 bytes .../white_striped/overworld_shiny.pal | 6 +- .../pokemon/calyrex/ice_rider/overworld.png | Bin 1111 -> 1113 bytes .../calyrex/ice_rider/overworld_shiny.pal | 8 +- .../calyrex/shadow_rider/overworld.png | Bin 1162 -> 1158 bytes .../calyrex/shadow_rider/overworld_normal.pal | 2 +- .../calyrex/shadow_rider/overworld_shiny.pal | 6 +- .../pokemon/dialga/origin/overworld_shiny.pal | 16 ++-- graphics/pokemon/enamorus/overworld_shiny.pal | 10 +-- .../pokemon/enamorus/therian/overworld.png | Bin 1451 -> 1452 bytes .../enamorus/therian/overworld_shiny.pal | 10 +-- .../pokemon/exeggutor/alolan/overworld.png | Bin 1368 -> 1414 bytes .../pokemon/flabebe/blue_flower/overworld.png | Bin 735 -> 668 bytes .../flabebe/blue_flower/overworld_shiny.pal | 4 +- .../flabebe/orange_flower/overworld.png | Bin 735 -> 670 bytes .../flabebe/orange_flower/overworld_shiny.pal | 4 +- graphics/pokemon/flabebe/overworld.png | Bin 706 -> 663 bytes graphics/pokemon/flabebe/overworld_shiny.pal | 4 +- .../flabebe/white_flower/overworld.png | Bin 707 -> 666 bytes .../flabebe/white_flower/overworld_shiny.pal | 4 +- .../flabebe/yellow_flower/overworld.png | Bin 735 -> 669 bytes .../flabebe/yellow_flower/overworld_shiny.pal | 4 +- .../eternal_flower/overworld_shiny.pal | 4 +- graphics/pokemon/golem/alolan/overworld.png | Bin 902 -> 938 bytes graphics/pokemon/goodra/hisuian/overworld.png | Bin 952 -> 871 bytes .../pokemon/gourgeist/large/overworld.png | Bin 0 -> 949 bytes .../pokemon/gourgeist/small/overworld.png | Bin 0 -> 949 bytes .../pokemon/gourgeist/super/overworld.png | Bin 0 -> 949 bytes .../pokemon/graveler/alolan/overworld.png | Bin 698 -> 749 bytes .../pokemon/growlithe/hisuian/overworld.png | Bin 723 -> 687 bytes graphics/pokemon/kyurem/black/overworld.png | Bin 0 -> 1552 bytes .../pokemon/kyurem/black/overworld_normal.pal | 19 ++++ .../pokemon/kyurem/black/overworld_shiny.pal | 19 ++++ graphics/pokemon/kyurem/white/overworld.png | Bin 0 -> 1442 bytes .../pokemon/kyurem/white/overworld_normal.pal | 19 ++++ .../pokemon/kyurem/white/overworld_shiny.pal | 19 ++++ .../pokemon/landorus/therian/overworld.png | Bin 0 -> 1265 bytes .../landorus/therian/overworld_normal.pal | 19 ++++ .../landorus/therian/overworld_shiny.pal | 19 ++++ graphics/pokemon/lycanroc/overworld.png | Bin 1572 -> 863 bytes .../pokemon/lycanroc/overworld_normal.pal | 4 +- graphics/pokemon/lycanroc/overworld_shiny.pal | 4 +- .../magearna/original_color/overworld.png | Bin 0 -> 890 bytes .../original_color/overworld_normal.pal | 19 ++++ .../original_color/overworld_shiny.pal | 19 ++++ graphics/pokemon/marowak/alolan/overworld.png | Bin 817 -> 833 bytes .../marowak/alolan/overworld_normal.pal | 16 ++-- .../marowak/alolan/overworld_shiny.pal | 18 ++-- .../pokemon/necrozma/dawn_wings/overworld.png | Bin 1474 -> 1470 bytes .../pokemon/ninetales/alolan/overworld.png | Bin 784 -> 887 bytes .../ninetales/alolan/overworld_shiny.pal | 2 +- graphics/pokemon/oricorio/pau/overworld.png | Bin 0 -> 590 bytes .../pokemon/oricorio/pau/overworld_normal.pal | 19 ++++ .../pokemon/oricorio/pau/overworld_shiny.pal | 19 ++++ .../pokemon/oricorio/pom_pom/overworld.png | Bin 0 -> 630 bytes .../oricorio/pom_pom/overworld_normal.pal | 19 ++++ .../oricorio/pom_pom/overworld_shiny.pal | 19 ++++ graphics/pokemon/oricorio/sensu/overworld.png | Bin 0 -> 740 bytes .../oricorio/sensu/overworld_normal.pal | 19 ++++ .../oricorio/sensu/overworld_shiny.pal | 19 ++++ graphics/pokemon/palkia/origin/overworld.png | Bin 1800 -> 1786 bytes .../palkia/origin/overworld_normal.pal | 30 +++---- .../pokemon/palkia/origin/overworld_shiny.pal | 30 +++---- graphics/pokemon/persian/alolan/overworld.png | Bin 689 -> 754 bytes .../pokemon/ponyta/galarian/overworld.png | Bin 738 -> 736 bytes .../ponyta/galarian/overworld_normal.pal | 4 +- .../ponyta/galarian/overworld_shiny.pal | 16 ++-- .../pokemon/pumpkaboo/large/overworld.png | Bin 0 -> 522 bytes .../pokemon/pumpkaboo/small/overworld.png | Bin 0 -> 522 bytes .../pokemon/pumpkaboo/super/overworld.png | Bin 0 -> 522 bytes .../pokemon/raichu/alolan/overworld_shiny.pal | 12 +-- .../pokemon/rapidash/galarian/overworld.png | Bin 965 -> 959 bytes .../rapidash/galarian/overworld_shiny.pal | 14 +-- .../pokemon/sandshrew/alolan/overworld.png | Bin 481 -> 534 bytes .../pokemon/sawsbuck/winter/overworld.png | Bin 814 -> 866 bytes graphics/pokemon/scovillain/overworld.png | Bin 1037 -> 1337 bytes graphics/pokemon/shaymin/sky/overworld.png | Bin 0 -> 829 bytes .../pokemon/shaymin/sky/overworld_normal.pal | 19 ++++ .../pokemon/shaymin/sky/overworld_shiny.pal | 19 ++++ .../pokemon/sliggoo/hisuian/overworld.png | Bin 744 -> 652 bytes .../sliggoo/hisuian/overworld_normal.pal | 4 +- .../sliggoo/hisuian/overworld_shiny.pal | 4 +- .../pokemon/slowbro/galarian/overworld.png | Bin 1046 -> 1099 bytes .../pokemon/thundurus/therian/overworld.png | Bin 0 -> 1976 bytes .../thundurus/therian/overworld_normal.pal | 19 ++++ .../thundurus/therian/overworld_shiny.pal | 19 ++++ graphics/pokemon/tinkatink/overworld.png | Bin 583 -> 705 bytes graphics/pokemon/tinkaton/overworld.png | Bin 1225 -> 1606 bytes graphics/pokemon/tinkatuff/overworld.png | Bin 778 -> 997 bytes .../pokemon/tornadus/therian/overworld.png | Bin 0 -> 1928 bytes .../tornadus/therian/overworld_normal.pal | 19 ++++ .../tornadus/therian/overworld_shiny.pal | 19 ++++ .../toxtricity/low_key/overworld_shiny.pal | 8 +- .../pokemon/typhlosion/hisuian/overworld.png | Bin 1346 -> 1122 bytes .../typhlosion/hisuian/overworld_shiny.pal | 6 +- graphics/pokemon/vulpix/alolan/overworld.png | Bin 607 -> 674 bytes .../pokemon/zygarde/10_percent/overworld.png | Bin 0 -> 693 bytes .../zygarde/10_percent/overworld_normal.pal | 19 ++++ .../zygarde/10_percent/overworld_shiny.pal | 19 ++++ .../pokemon/zygarde/complete/overworld.png | Bin 0 -> 1185 bytes .../zygarde/complete/overworld_normal.pal | 19 ++++ .../zygarde/complete/overworld_shiny.pal | 19 ++++ include/config/overworld.h | 2 +- spritesheet_rules.mk | 54 +++++++++++ src/data/graphics/pokemon.h | 84 +++++++++--------- .../object_event_pic_tables_followers.h | 48 +++++----- .../pokemon/species_info/gen_1_families.h | 32 +++++++ .../pokemon/species_info/gen_4_families.h | 8 ++ .../pokemon/species_info/gen_5_families.h | 40 +++++++++ .../pokemon/species_info/gen_6_families.h | 72 +++++++++++++++ .../pokemon/species_info/gen_7_families.h | 40 +++++++++ .../pokemon/species_info/gen_8_families.h | 8 -- 112 files changed, 896 insertions(+), 202 deletions(-) create mode 100644 graphics/pokemon/gourgeist/large/overworld.png create mode 100644 graphics/pokemon/gourgeist/small/overworld.png create mode 100644 graphics/pokemon/gourgeist/super/overworld.png create mode 100644 graphics/pokemon/kyurem/black/overworld.png create mode 100644 graphics/pokemon/kyurem/black/overworld_normal.pal create mode 100644 graphics/pokemon/kyurem/black/overworld_shiny.pal create mode 100644 graphics/pokemon/kyurem/white/overworld.png create mode 100644 graphics/pokemon/kyurem/white/overworld_normal.pal create mode 100644 graphics/pokemon/kyurem/white/overworld_shiny.pal create mode 100644 graphics/pokemon/landorus/therian/overworld.png create mode 100644 graphics/pokemon/landorus/therian/overworld_normal.pal create mode 100644 graphics/pokemon/landorus/therian/overworld_shiny.pal create mode 100644 graphics/pokemon/magearna/original_color/overworld.png create mode 100644 graphics/pokemon/magearna/original_color/overworld_normal.pal create mode 100644 graphics/pokemon/magearna/original_color/overworld_shiny.pal create mode 100644 graphics/pokemon/oricorio/pau/overworld.png create mode 100644 graphics/pokemon/oricorio/pau/overworld_normal.pal create mode 100644 graphics/pokemon/oricorio/pau/overworld_shiny.pal create mode 100644 graphics/pokemon/oricorio/pom_pom/overworld.png create mode 100644 graphics/pokemon/oricorio/pom_pom/overworld_normal.pal create mode 100644 graphics/pokemon/oricorio/pom_pom/overworld_shiny.pal create mode 100644 graphics/pokemon/oricorio/sensu/overworld.png create mode 100644 graphics/pokemon/oricorio/sensu/overworld_normal.pal create mode 100644 graphics/pokemon/oricorio/sensu/overworld_shiny.pal create mode 100644 graphics/pokemon/pumpkaboo/large/overworld.png create mode 100644 graphics/pokemon/pumpkaboo/small/overworld.png create mode 100644 graphics/pokemon/pumpkaboo/super/overworld.png create mode 100644 graphics/pokemon/shaymin/sky/overworld.png create mode 100644 graphics/pokemon/shaymin/sky/overworld_normal.pal create mode 100644 graphics/pokemon/shaymin/sky/overworld_shiny.pal create mode 100644 graphics/pokemon/thundurus/therian/overworld.png create mode 100644 graphics/pokemon/thundurus/therian/overworld_normal.pal create mode 100644 graphics/pokemon/thundurus/therian/overworld_shiny.pal create mode 100644 graphics/pokemon/tornadus/therian/overworld.png create mode 100644 graphics/pokemon/tornadus/therian/overworld_normal.pal create mode 100644 graphics/pokemon/tornadus/therian/overworld_shiny.pal create mode 100644 graphics/pokemon/zygarde/10_percent/overworld.png create mode 100644 graphics/pokemon/zygarde/10_percent/overworld_normal.pal create mode 100644 graphics/pokemon/zygarde/10_percent/overworld_shiny.pal create mode 100644 graphics/pokemon/zygarde/complete/overworld.png create mode 100644 graphics/pokemon/zygarde/complete/overworld_normal.pal create mode 100644 graphics/pokemon/zygarde/complete/overworld_shiny.pal diff --git a/graphics/pokemon/arcanine/hisuian/overworld.png b/graphics/pokemon/arcanine/hisuian/overworld.png index a3c67a34d3352a96324beed15ed7bf776504e698..ec9fb5d8f8460cbd5d41b8a1d3710233659e88ed 100644 GIT binary patch delta 990 zcmV<410npH38Dy)7#0Wv0001UMu)cm0004VQb$4nuFf3kks&^R1E5JnK~z|U?U>PW z+#n1^Eg@KYo&Epctt2ouNSLJVOkYB$+0Gut+zXPxU6$X`41CBR&o5&dFpj`@uW-g6 z4#X&9EU*L&BLv?mobiXFs0(2Gzva9hy#|PYQovfoo(EVe=U6iVvBEO zUwVNZ*JN%raD5?R;7kkrX$5k?m74%0f}$`0kYnJEW2ugRW08A-9mo8jMguSEMoBX* z(Pjm*LE%!u%-t=ZnuAvVgv)cKJa}_mfjy6|0pjP1N&d6~3zshCaxJqu+%7cc7)yCW zuE1Vk%Qc-s?*O>}Q^_>>GzK!)bHd}S52`+J9NckCM|JxGJ1$S z0@oDrw&0F`V^W3OT!mVJEzgf~3|uB~1kSiVR&J``>c8b6`nD}e4Z^xsf#~y9&Xmxd zxepH_kdg1IBGGNbSKfwjili?{FVZHxlCJbcV9!fCXf!-Lh#-8R^bRR==sl>vc=FG+ zh;ZK$zSB!|^A=Gr&~kJPyb{D?uvueZ!r^ljNT05M%GqG`r@Yw!&JV3qP_`${l~do0 z7lAJjg&GGh$G|;bPW>{=$25UYy~_%3kJ)m-$qECdT@_x+Y{v8SA<%n^jNco*$$<9NyXQL_xJJkVV_ zZ{#z62qZaa(ZJ&oD0xfZ8Pr{tcLv$Ne4{WNG6k&&6Cn@Q!r;}m=U6_;DtE5S`6$j$ z8eFIIx9A&`Leut`E8ghm`S~>nYAo~-{M)RMFHz)NB+A4GPoBY3w*Oyu^;_RymY@JV zl6|AAuo!ScWN~?CVf;?K6h09+9mB{2xB=~#gJ;0vy|90u|Bj!JKP;&r3j_K_6951J M07*qoM6N<$f{a2$~6y7zqRe0002CwraMKEdfB>Z$nykeWuEkdihCr69SxKH}7NKEWlfG;Y)bpRg9hnFp^QAX9e@;nc;ue z_%Z`V8!jOA37$7I0&HGn?dSM1*Kr%5n^~Zl6a4Qh^uPzO{M?c(HxcLtSh+(5Im5{zQIL1%$>JFr=iX5Fp9-xK6Nj0JbrS z%gb2@(i|8-)XFZwXBOB<;wmpQJ$QeN=LsP))cC#T^E4ZYLWBg@q)$gAxsPF8Y@=9V z!nnPzga**6Mo(zJDHYZX!OEJ~#(YL#Mb*=Tw!^nZv zm0izXUfPQF5wmXrn4Jj>7U(Ec_%OvdRYjYO7xr`M!Dy3J(`;45!W=T5=P`d^rnxlE zM8ulHa8aRwfo@+YWHeTg=LX+ZT&k0?jCjPkLq@1jGGYuzN%qMdPe+a^SI8L}j%mxF z-x7h*VFD{Ka-qQ$X4r;p0R?fJ_EncwJa-t)$g?+R!{DFFvsj}yOJML)iMTLZT$}3s z{mox{4REOB?|*&ID~Ex@6>NV1Hhe8EiyW&JyV`D*6NmgR=c=uSNm9_gJpyys)d@@S zh&OzjgsHw{BjGL8go0{D3PDw>oXh5RIC}ru(K}tAZq);Y38Q4wy?Y?uj%3y3*a>G9 zwqt{j713P^Q5F1XK02geeD?tbC(X@(gDOHJK>i4ULL;9ejw7=6Iahy(WLY_4uM$L7 zWS4xd`1lH}JR+~NNV4kQ{=zG*9RC?*bvoujl;yKUuqd$manc_cj3

2+fz~h(0*! zT-mULCYod6JZ~Y*r+?@WH`F|X_B2?$99O^&%Q4(`JC5&Zch5IZyGDlZf?)^`ka~6I z=fc#3x;G4BkY`XeG;@Cj{*Cj~(1q*MyCi=Pg@#)QZ=8J8cCN{0*C`ABQnrR_oA&@K zIab9hE3}hSoB~53@O48@*sz4D;#V?eMpdb14t>s=k({x{xF4RhP;?eU&kdz#AV8U~ d^ZXWH{{deE59D!8`NseN002ovPDHLkV1oYP9SHyc diff --git a/graphics/pokemon/basculin/white_striped/overworld_shiny.pal b/graphics/pokemon/basculin/white_striped/overworld_shiny.pal index b4e0639fc8..9f7acd3090 100644 --- a/graphics/pokemon/basculin/white_striped/overworld_shiny.pal +++ b/graphics/pokemon/basculin/white_striped/overworld_shiny.pal @@ -6,13 +6,13 @@ JASC-PAL 255 255 255 172 197 255 0 0 0 -32 139 65 +80 112 40 16 98 41 123 172 172 172 222 230 -41 189 90 +120 168 56 74 74 74 -90 90 90 +64 80 80 57 74 82 123 148 197 123 148 189 diff --git a/graphics/pokemon/calyrex/ice_rider/overworld.png b/graphics/pokemon/calyrex/ice_rider/overworld.png index 24b3b6215a1198a2305fb7290ea9f58d8dd68c19..48952c59fa266738eba97536e555264d9d68a69b 100644 GIT binary patch delta 990 zcmV<410np^2-ygbiGRCEL_t(oh1Hksma8BPMU5aBaKZb(?L7gV>68Gq{<_T6Qg;j| z;nQXLQ&uTUw@mP3{?LOltKIOo8uJBy%pZF&&Ug>(J!-e{V-AabH^o9K_c`3|`|hpB zRcT^^AM>j3v``h!xwNoL1E{qDjPYZB2`mv$* z7QT3O{{@GInEVJ#)OeWjbj0W)mRVfm(FQQY!lBR=d5-V%%jDFj8BF#E&K(S6o3Diz(DJw2~WgZw86%WDYgNO@s(oNOYoS-xP%QRrWlyUV8+h~nTtY( z!rQngWOn#;+>bbVHCT&LUM<=HC%m>`k>d~oGHkUWI>rc)5;PvEonLbvF}Ex__OiIk zYYQ0(mSSVp0vKZ$7{jJ~I{pVdT8KGa0Xk6Lq&90x- zMmz^*2OM;zo9v}U%JK(vbMaF1K)*cXOZt+W@Cm2HD zW=VNxnBc{vWC%+HN#!1|-Ac5kZP=8ocJmaUAT0+JJt5q$_r?~1X|NHsv z+W30BI77E$mLWw4HY>>6FlS+AKH$H8GM1|x z#_ugIuUUHI^v-LsnPscZ`CWbWArXYY*(!|WQ^qK+RBzniOIhqWqluz_X^$&2E@iV~ zqJJtp;}dK*9m{?xn@!N;pYfb!ei7N4KPAG#`QnNTyl%MGpC15B)Tl91;^kTdHr z0K%%M9z?2l(ZHLQz$o{5>Cjpz2Ap!b3QK%&6qL7t@_0QX=>m%b1Sm?h-WTWcnjvSl zs2)}7{c_dYmqCs>(pOmHt44YNn@H0IE>~B8rPx# M07*qoM6N<$g7tjoX#fBK delta 988 zcmV<210(#|2-gUZiGR6CL_t(oh1Hksma8BPMU5Z`xZwTY_MQZt&XfSP{<_SRQg;j| z;X_=OKV{{zbjt)k<_|p>v)T=Rt1(~T$NaGet zcYKWTb^HD;hrnMZXtx23IeKs`aAS#13t))P+iUrTi$M1>Py-lo%E5sr3x&>wOt#BZd;E;ovQmkn5PPMP!wKdDJL5b)`eAp#i=>6;XwKFi5NK}kOQ9ziLf~de zd1sj5#pG-VTLf|A9}9fN2hE3TWTMeBRH;RkHd%(BoB~#l$RR$T)J?v7v82C(4YU z{yq5>vxMiGH2fb86U_SXgg^ChvpI_OInNLFix~=S&hrE3AguWFwPD6jfg40Ivw^sQ z-@p2p;3|-H?R)*w0_bqEfz?4CCkE~*V2lU~Yk!Jo{Pa>wEU2(s)v|nwt3LVP&u`bp z*W=<0!-`dg6dib2LEeTn3p4WpfB7lcu1e&pv=7TM#>^xhUrsJb`#pd$uPWI$6vl$z zTUvf+>5bDnuf>+YkJ?h+)mI-JL5!hTg%N*bj-sY|;Rau1vkwJbi2kKLuFN=>&9aHA z@PCYtvE6jc&r5#TL_Pi)FNN0^k*)btA`~7juDHPK7Ei6N!i_z^#A+uAzCT7jvkn6w z?276^q~u=lq(%XSSps zRqA!A_5OL1V~z9`*7&NC9>B)Zbb-qi;8kg*M3*=KDnaj`>UF8R0m!oMDy*Q{LEmrh z2)v|s?uYXvx0AFq?{dA`bprUU;|}=HYIy$(_RP-wd?ez3D*ph+h(q*MpsvjT0000< KMNUMnLSTZFZSjr( diff --git a/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal b/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal index 9eb0730f23..4a45354c83 100644 --- a/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal +++ b/graphics/pokemon/calyrex/ice_rider/overworld_shiny.pal @@ -7,13 +7,13 @@ JASC-PAL 0 37 32 146 175 206 183 206 229 -0 75 65 +0 88 72 52 69 167 -66 119 111 +0 112 96 100 100 100 242 242 242 64 83 103 -216 215 206 +208 200 144 0 0 0 -169 160 155 +168 136 88 191 191 191 diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld.png b/graphics/pokemon/calyrex/shadow_rider/overworld.png index bb8c91b2f3a2df113083eb4f7fc719bfffd872ac..8aa1a2247e99f2f8a10b8158ae5d2b58866fa2aa 100644 GIT binary patch delta 1051 zcmV+$1mydQ35E%fO9KE)L6J@v1a-2rp^<7If9Od>K~z|U&6n$UMC4|(_#P9xy2NBF%z1fEQAod;0oxaAJ+N&;&5y}t=`CxcP| zH7-kV2X|qSNBF&eCp0+(E^@VK@?{FDv~a3n$^}&MYT!&GzRUg(~t3-pc+pOpC7x3`!+x@MV%Xf9TK;QOX&v;UmZHCc_QfsnW!ofiD=eIEPS; zap?OPRZ9Zvc$FA}!{;`@3f6%NH;Yn$4Nj9eYGj5r&iWX`0Lu&_rv(eFXF=mmy58ggnOu&J&1hBByt021}$aRZs@oj)zVPDE|1Dil+f6sdV zak<1QhCZ2R4A6yzE%@+=?;~K2L*f8)EeWXNHN!k`@~~M7Af9kqLer;I2z@_469gs- zTl^S7#%MY2N699MUT_|P`epF~g~E%>e@<``AQsk)H9F7ZvbaCfgh<`_wAA8Xg}X$_ z6f*w_&QeVM*lF3Y%B~TZ{xd%Nf1|8wb(Lva<%#2#`CGmZ5k+MfAQ8WpSq{Bde2qZ8 zTc*7&&R_kn`0KA$)}ARAFP`coK;LJ3?`rYA0JDsv!&(t>5in&B^HHaIVp848$V0X4!XpDo2L{!Ou9itJx$ig_c&l2(8jcJ}|X{UXOFUcgE3 zEbGV>E)yPBkcXLyM6D?<@&3fO9C4BiYb$Is?Bt6jJ4<0|3Jc8aie38$Sk@Mqml%59pbAqSI9b-l131D_PGes#-H8nc8j>EV!Zhlg^pmHLhx z+X9dg>SI1d#Lja#(P$Rk(aS2}P9d?}xUL!_XU|P`7=f-f<-W!G#uwlF%5NkVpq8TB z$B=r8r7N%R-2m`T;TGSW|0;g}+)T19z)Y-1dLWa=8IhgtPmnw7cv1B``?5`i?#oNzxVH2^ae227+{0n zia`f|??2daw84TG@44mu(fpW^c7;I)fA1gkC5x)UKIaG{2f$S+ppC!xPXdEQBY;Ql ze_R+KHS63f{JsBRuO|HCC3k<^Wd!_n!)p`w{o6PQyqMs+44}<%%beWQ0%+mBe;X%( z=3-C_pv7f(=H$lh@(O?NKL|}ufxFx-x_n=qDlLqvTT1~=91Tp+i0`_81D_^IU(KM) zS0}Tw&EnQlU>gSmbF{jD3)A9b0)twKe>!|$#m_oVvzK~?TlmbedB|`F52`e=!N67w zdYnV3dOuH-_o_94Z5$;!XYhFpuz_`^!emhku)}GxdG*Y&`b}SB7+{$}QS>PV;e(bbtSY`JJe}euizWSrA8tN+R8s&-Mmib$L4B$i$_zQoF^3vqlrg2a$3H0+Op)U&Pcd)gSn>)m!zTP6(=T#- z;T4?q&ay6C;j-dk1$mgMNK{O5jZYVza>Pk8$5z>9*vSV=ahAf=6c(7-m2hoeV2RB$ zF)LEE=yB_bODIYvjxnU2Vj1e|`!E1}Qkdd<@{i(=&%-230X|EJ0-CtnI^F+@Js3(1up{DED*vDM Z7f(P?k&PDHLkV1l$_00{s9 diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal b/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal index 8114f67fe8..5454cdbe6e 100644 --- a/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal +++ b/graphics/pokemon/calyrex/shadow_rider/overworld_normal.pal @@ -8,7 +8,7 @@ JASC-PAL 246 242 246 65 64 74 32 36 65 -49 68 164 +0 75 65 213 210 205 0 32 24 148 174 205 diff --git a/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal b/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal index 8114f67fe8..61607ea95b 100644 --- a/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal +++ b/graphics/pokemon/calyrex/shadow_rider/overworld_shiny.pal @@ -8,12 +8,12 @@ JASC-PAL 246 242 246 65 64 74 32 36 65 -49 68 164 -213 210 205 +0 88 72 +208 200 144 0 32 24 148 174 205 74 52 148 -172 161 156 +168 136 88 98 101 98 24 16 65 49 36 115 diff --git a/graphics/pokemon/dialga/origin/overworld_shiny.pal b/graphics/pokemon/dialga/origin/overworld_shiny.pal index e6bfc48201..24814df9df 100644 --- a/graphics/pokemon/dialga/origin/overworld_shiny.pal +++ b/graphics/pokemon/dialga/origin/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -98 182 49 +0 40 128 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 +156 172 115 +8 106 123 +8 106 123 +8 148 156 189 202 222 -32 89 148 -139 161 180 -156 210 246 +8 148 156 +115 189 156 +156 246 148 16 16 16 24 40 49 diff --git a/graphics/pokemon/enamorus/overworld_shiny.pal b/graphics/pokemon/enamorus/overworld_shiny.pal index 88fa42851f..d1281fa883 100644 --- a/graphics/pokemon/enamorus/overworld_shiny.pal +++ b/graphics/pokemon/enamorus/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 41 165 49 0 0 0 164 133 41 -230 117 156 -189 60 90 -172 72 82 +230 131 164 +255 90 0 +189 82 106 238 234 255 32 36 32 57 60 57 205 202 222 -148 32 24 +164 24 24 255 198 57 16 16 16 -246 85 139 +255 139 238 82 80 90 115 48 57 diff --git a/graphics/pokemon/enamorus/therian/overworld.png b/graphics/pokemon/enamorus/therian/overworld.png index f588895eb27678c7359edcd0ddf78fd1ab92bf81..c52037dfe4bc556d3aa387b50e6cab7d80a037c6 100644 GIT binary patch delta 1341 zcmV-D1;YBP3#_ zY9B5RNkla?5*0lMi-2b;vHJARP33sRJFyOF#j ze}zJ!|6TyFz5WaS-|J%zAfkg#DZ>qNO1|T}`PSS%miu7@9s`g3{oZ-#oPmFQ3AlMa z;g;N+`MuC_1aVI_yUU^%9d!gmj6Z8PC09KxeUpiX=UB?!3_HspY%z!mO2QMv?_-oG%`4Yw^)Ccg& zn*!Vm=@nGINk(8Z@WiVFHe3SepjU`;wjO&6(8EI}y7Bjx8&Bb`uMXhK+XCFhfAffB z@j~K%b>;xh{9q4&Ii7gn@qY`@!|Qe9@SCf#>J7N?#sGH_l@atrgVDfO-W(qd&>>rw zUH-2Dnt5(qwOg0)1BgT22;TFy0FUMRo)eHOd1;m` z+h$H;{n;;F)!E4KKV(KBk$4*sk z-?zMH34z2jXPPFGwb)EI^I{>7Tb2^fUA+cq=SOK_b`WG0xzTE1wSC|5o+U(AZ!xfU zInc_}atY@NOr8no;u)G*IqSMbxR$6b@Gb8e!6XxEmKW(_uoh|L#WyOKe=l^MzK7># znYm}wLy-PmYSdO}RB&e|hG!&Dz0Cl?im$>qxFC(aNvlyJ)fO>+xU%ACE76m+A{N z@nyNf4s;UP*9%x##p^F24g9`-NCV6CDVK3w#kK6;Ebh`LsJg&(SZR zw+DDJpsfeYTl96n&wlI;0bD-a7NG6u*Uwu6d}lyY518qzf#cIKiLRe+3($7->*uWj zzB8by2h6l_z@M)8>EoO0z3HH)9{9YWp%3W~*RxGLzyAnK00000NkvXXu0mjf$;h)% delta 1342 zcmV-E1;P5P3#$u|MJ3>LoUTe&5D*aaE-uF|DU%@{^Hh(!K3@0kO#j6^0002=)l~D5 zY9BETNklIv3fy4zRlNr)|3x4Gxj4t8C1s}#7hL5qn zD^MGF;FFS{ZzNzl`kYj%m2JQ;JOs{VXa@3scv$dr%yIY_E4Snm&qKX|Zypx|kGIx= zoVbvrZa|}x0Y7^v7LLt8E;rNHdrSpc_t63`Fu;%uYkRO z2K>T9x`mMmLj|OQIMMgJdkXjvO75WijT}vB;3qHHC~A4KaAc_#&=Kh5d}eDkZJ0R+;@O9ua6{j=aF52+hCVgNNwE|u-;HRvFG z9k5lfAg)>i54@p$Ynp+|C>H08o%}sU>=!&fl@AwCOosVXdQyDl*+cy6k4`o+QL401C5+I z%2d`Lf~0>2{I4Dk&A^S@M|9#9G~o`9tez{SOiS^8zawwO{{qh*QsKOp7#<5q|Md9Z zJRGr*3azA4WX)k)zI+R``9I0-%?2(O1N=PVUIAE2FyVjoa0p(oQoX__?j1INfw2L2 z=LK2$g=cZny5Q!a7r>KPhnjJhhf=A)wNmTo_)kYr`V3&2KRg*~-DC!DwIZqyBYqx| z6tJY5p#e7B=OLAwI}JSiA|JvQK+8Ffmmf!CWnRX*8?l$?PZ6+JV3`K=HFxwEb8S?`D1?k+$(*5QB;1XiQ(oY06;TvM&+H%jJrI9dVf5AI?TIQO0)c; zJ&@MFrULpD&X)Z=9%LW|m3MhOfRAtc70gLaktwxpe0UjqaF2)YwZqNh*0)=b>|lIb z*EArLT{G5)>>!US{wX@(<6E|}g-Z!-8y_yffxA4U5=(>W_SbhWc@#>2J6P8FF9!Bg z{Jo##)eUg)Tx*8U3KHb;3hcPgL+mSuP9KoxHw{3wtNd?vkzs{qM822ye*7c7m!J4? zKn8dlIIH?^$9*35BP+8_^W1){4aibS_fHYR%QpwV@>d0L;J@G@0_3xFw}8?qd7y|r zp6VX#;<1!t{+b3j@yY3bVQ+sf->hy4lvV@H1gsk<{d4m>{>on601rMnJ?#DGB+4E{ z=|8W;#9<0KxIs}api5r$G^ktH^Dlcvs=Kfq_j<^5IZ63A4BD})$n$g_yXyXH1=Itt z!qYi_je$;l@_N`#tcW{jco0SguI~UvP6bN7e(|f0mz3YM_H&GX6Q8^u@{ODd?oaZn z);t!-!w^Y;KmR?q?Wy7gc=4dmK{|;2p9i0)eW*_3zi_B(ym<)wsYq=i4gb0x)aLaF zPiT3xx9h42@?6(8XyXkz>v$P5#@BX&q3|*$IA^C z91YNg_#R)G{5A4fT((7#!0BqAgUaDgm#ZzfFhCRHdwgZ`*T{2wD%RlnYOjN;;ZK*V zEx0g16XJV(W%5SkcO(9C0_t!VGw9bX3H>MZ2TY7jJmXg&u>b%707*qoM6N<$g4GL~ AG5`Po diff --git a/graphics/pokemon/enamorus/therian/overworld_shiny.pal b/graphics/pokemon/enamorus/therian/overworld_shiny.pal index c799ddfb89..e650396bc8 100644 --- a/graphics/pokemon/enamorus/therian/overworld_shiny.pal +++ b/graphics/pokemon/enamorus/therian/overworld_shiny.pal @@ -6,14 +6,14 @@ JASC-PAL 118 50 58 232 232 248 200 200 216 -224 116 156 -174 74 87 +213 106 156 +213 65 57 16 16 16 243 46 46 -199 46 41 +74 74 74 147 33 30 -243 84 143 -187 62 94 +238 131 230 +203 0 128 247 238 76 255 197 60 0 0 0 diff --git a/graphics/pokemon/exeggutor/alolan/overworld.png b/graphics/pokemon/exeggutor/alolan/overworld.png index 6597515899cf04a2b0529e2b15dcdfc854f5a338..07e24d5c6c19e042ca0e2d6e10dba08143af933a 100644 GIT binary patch delta 1349 zcmV-L1-km!3Wf`i7#0Wv0000ahERKJ!o?~hICrK5Y!pCR~?F^=% zEg;s!@pBY^!mxtL&rp+Zsy__CzC8gg+sXQe;`w9f#xR<5y8z#0unAZPJD6f+4B59) ztjCB<{t$Yw^PA7xk5VOm422jP*w-&D;@}R1*|!DH^K2eAHDek=XoHk?Gbonm6AdC_3^T}d{w5AF#uuE{9F2^hSxvLzBPr}rJLoK{P}pq zCIF#-oubyo70f=;1sIB@J-Y#62Qd3KmWQljvUmu|y~yP^(H7k5H$4M{LGl*^q>WPs zK=$o44OZc>8A|@>^rh7PzgbQXfI$e{}c9*Bp$QxkONYLU0fwg{77%k1zZ#guAIgU<2^PA* z=OqUNRei(9zE1I{>G=|d@r&-Dg3Y#&8JNaD>y~^q8DFoW7W@={FtF-VA;-sBsMh9T zQa}{XN{}|d49w%7%lbx>?Y+J(Xs^II=xE@M4{hSLz0?Le0KrT3b9E0>uZ2N>d`n-! zw)c`QXn|eeV4&ek46YM6RB%dw6Y$K};kgO8Vs%9eeC2j9aK{I~aoj36c`I}lK6@)x z!SSCGyknzZ2mN7S{PUD@ulMDXBZl`55EclJj-SWh^Pj|MFq?${gFc91&I>3=W={SG zk!}3+mqGSI5F9^=TnRu6(KO&B3H%e|BXNBOJ$m%$@wfO5slh{aSiJ^+00000NkvXX Hu0mjfj&On< delta 1303 zcmV+y1?c*Q3)l*f7zqRe0002tcD;;|EJ(j0hU zwMuX4$#-^cZ$Z}k06vV@ibDcnxpk59Sc}w$LF@j=2M7U2&6O#xNfQX+nkDrvEaA%a z2e>MuXP0kg9E%VLnk#?*H*fwkPtRJNWi`=66HPSHL=#Ok(L@tX{BOdoh5!4oPilW) z+u^cvf_f1``lCdI-Gi{*?%D~ANMh+3fn5z(Aj$WO=)|#((kMWZFj%N0RF11sEIlI- zJ~)URZ1q0=#PGxpq5x|lgRNMls;v}S0w;)lM_}Dy{Z)$4^@ibTfHjE55VlfrtP&}) zA{c>C(4cM`YY^=ZBJzEy(nL9MR{wuFwuF?f^5R4e{Zn&&v_QJ9r=rvy`bd$CKgbX( zC=oU|GH*a*ZO}`V^n=vA2Q3i3uOt{42Il#&{;C|I@36=JYs2*$jCQ2VEpY0^!+4^6Z3x&XK`f^ zZW%b?r~_IcU_>EYQp$HsnDnDcCxk3iRZ++S?iZ`)B3g85g|02IGM#z9U ze-PsJ4^!P`vxLEL#=lq>MKO-i9cY1g{T9;qN62EvpUyDPr;9~CeUE=^Kx2shsw@gT zKO+$H>jfBCVwm=)|EkDniwth@&j4Kklb`9|9uh9Yzswnb z7TZF*W(Vs|kez_tqt2*s>@z%k3F`2BEkI2U@cwOHP2?>_}C|65@gTW^h{~fZgv$FX5 z&&OL6*9Nn7#T|12Yp9U8saXC~QBnnhL6ZMblBS zLvC5sXOD7(Zm<`p-gf%T`m+zeX^MRs+8M;SWeski!x*&mXOW+8XwI!C`GEW=0~hGo zhhIs7kdrT|0tYvfG5&v4dVNM3D7f`xdAvg|2fIQ2^)<3L(ZnI~H_3fC?4Q9b)c^nh N07*qoM6LruV1hy6dVBx? diff --git a/graphics/pokemon/flabebe/blue_flower/overworld.png b/graphics/pokemon/flabebe/blue_flower/overworld.png index 02176b255c3da2fafac226cb815ccbf226b4b1c2..cd98db3a57e2e5dbb0dfd9a376528d68b0039f76 100644 GIT binary patch delta 610 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 AQUCw| delta 655 zcmV;A0&xAB1;Yi97!3pi0002CwraKj001YEGAn;L4jcgh00LJ@L_t(|ob8q|Z__{& z$L~C5%K4g9;3dA3id3=qUYeE>1wMdFPhusNyf781f`J7g)UJq$Ev)fmbxT-S!en#}FJc;A+6$i=(H| z1jG^eS&pb+-TQisvW8=yR#;=ncoS23S_B=LXNfNP|o2?03E96ZQCe{KQFbASeREg+d!V*ws+56y9qHmZM);<0~Th+Rv(6n{ch-QCa zdZ#P{+=2Jkq>izbmsAUBAgNqRGy;i^Qg73TA%57;C-h)Lz@ywy0M}TB$H~vo*<0FX zm-_WG08Dn-|30M&##lw9%<5W$yHG#@TpPQeld80Ej-z;F`f;B+sU{9jx{pQSd>+ZE=zh=Zs}D*mUJp^ zV#XR-h}o=DwP?907thR`3iii p#6PvpEU7W?^#^g6Z6)>FegU_~oiqa*go6M8002ovPDHLkV1iW;H-i8G diff --git a/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal b/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal index 66317d4037..43b725acc2 100644 --- a/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal +++ b/graphics/pokemon/flabebe/white_flower/overworld_shiny.pal @@ -11,8 +11,8 @@ JASC-PAL 232 153 2 221 181 0 243 86 75 -69 66 127 -154 149 228 +31 95 31 +184 216 153 96 90 188 0 0 0 0 0 0 diff --git a/graphics/pokemon/flabebe/yellow_flower/overworld.png b/graphics/pokemon/flabebe/yellow_flower/overworld.png index d170322b186c8d3b7bcfecd3311616c80e22e3b5..b0f7a47f7a3e3d3fe2315fe4153ac7ed256ab1ee 100644 GIT binary patch delta 611 zcmV-p0-XKd1)T+u7#auz0001UMu)cm0004VQb$4nuFf3k0000mktH#I0002%Xt$sM z00J9HL_t(oh3%M)Zi6rkgmFwDO@Y1t+wN?j-PYJ)X{Txur)g?+Cce+%Pwl!>r%s(Z zb?X0%D17}Ih~AYXgwS9UGs8h{AqfFrzY|meUo-)2Z4=nG5HR)fzh6H;*goLX6IhG- z-pTLSnwk5kQj9`C2k=&Z5Se4s1hi;9T2u__*|P4yV~R12JcOS$#{dsZzyjP7#u%t@ z@F9Eck&>~t54acfQqZ?d01BMOz-GXTy*3H@XZt2#wV(ocht$)nxPos>#f4Esd}##i zXjlg{v`v6m!e6Rix8r*YIW^Dd}O5YGar_}6(SEFbLpwS+r;E?wY!icIr6|&;pV{HTtA@&i?s+Eg{uD&X0Rxqc0bSGPe4agtGaw xGvBAxOunm@5b*Se`Cp&|3E%f~!%_V*;U~sl9HI&_2dV%7002ovPDHLkV1j-}8*%^u delta 678 zcmV;X0$Kf?1>Xgb7!3pi0002CwraKj001qKGBJPfebMg#00M1EL_t(|ob8q|ixWW< zfM>Q$noRbR!}iQU^|Nw4#h$ck-Ju`>|7gR*&^0qiwJVC zye3>3B3K9igOfyW-fV8y;>0Si$mZLfdEa|8lO>F8V;kG}FCpC3#S%A3(sB*7TKYSO zj_ZGks^vrFdLgf_uU@4fKXi=zJ`kY|?LKtXXO7T@mL-JSx*D)46c1=Z#&`O}#{s%h z%0B3XhHyDx=h5B!kSA0l)MG(bxCTc;5PkLdg*@wdB3B3xr91-NqA65&~-Hh?hpUeloc}OpZPSQb?|=-s83DlfS)g1)_m}W)SD5mlr7p2K*u){ z+-igUu0Y6-0eYk&Q>e!Kpc__?I{-w#RvH~;g**TVs30S>ZPVWdc*1Bz`|Wx}IE1#{ zpabebKxb?S@4Yt?+8?Nou@YX^2KbTizQL^YDF_;rmqNm-0GB4T_J&3SB3jg5ry+mg zOM_XQ-uZzk;jcl^OlgK5?I5Zh8Xa)NSLaQ{$`z*z%8WL`e97KP5OJam>v8jc%_(GGM$+#@MX&WX_UuK#(ATE5ZA>b24r^^7Z=1@4#%UYG#<2M>5fDAcS0=$|#fh)!`R}}U*0yx*#0$$76DV*ndU1|z@ zoEAiwNCpDn>it~WO9akRWPXstV1e%iSkILJujM??vPVvTApUZJJx;64ihsFFBuRQJ z=Oq=GE9`Lu5YIlqq6V=AbHNh<72aE)a1}UXYZObOl?0kx0sv@_ssS5wn#e`Q69H_j z<4Xv@Hd){1h|i16yCFTkCQa7m5GeCxthEN)jUKf&5@0Q5JWUYB!b1RXOmPTb=ka>O z`hZldPn!6DLDS(x8aMJ=JtU6q*1cTxA)1sIts-SsyR$wW?ge6!c2PL)XqTCZ_aI=$ zRmS54MT@xCCyZ-z`Mp0&L{#C(>JT`7|5#~aNJS-oU7y4ac5+kUULdMMKi{Jm!v>rp z7j!FllpqA6&)q$C9E#`ol5pG~XM$u<0@OfS&Gi~~C~^?^(Z3mY0$FwyU5rYN5;Y8cUl7PQiWN?LR0?Y*$lTB_@95?@;LO{kd12#Ipx`$jY&?gu; zmZt`P@{S?%(wC)v&v}>fu?tlE5<>t_0~(ijm_%qMP=p7LE0g`w%8KI&Qwj_TIzEQ= z6VMvic&;^Y;ItC@Y@=NM&3~;Sechm2MWD_@9K7;vCw%i!oCypwo?oozT@vS_x`E5s ui{eytTnfDRv)twS?y|1cJvN{5*6|BEH#a9p@~KV$00003Il`d5mz5!J2oOCdWLk860l92_UM=!xQvScvnfFd!(UA$y6LzWI%`vLe0ea`1g zViOZcr%F8$iQm2apY!+;{{(9`P}I{~&KjOLUQo?JH+n9KZ0%^m7u7^;?!`2`k z_s-^;97;5OO&7<{VOjSlPSG|m$9g4)0%xa;9A z>7)2gl;`$gi-pnSxOo+XaB6??OXVKV%>rA_+ux%{)v1@`8HzA3C@ZEz;I%oVp4^Hi z_fsfVDAmncGqcW%C!~u{Caacha(M@8Hz? zb3*}B7nZHIiVgnO)XXb&dAh;ieeE8ja>T17Knmi#hnw}5C`4h{t>E~L_SOg9y z%qO#H;)f7X>Xws0R*)GzBn6ORx)W=D!m-t|ABueTl_Qr7B+mn9Q|85&5Bmy&IS--$ z{DYRijF8faLUTFKG&?L}JK`yjlnRuQ^rS71XPW$^>uJwF+x`G|U)O1VXk^g<0000< KMNUMnLSTY>Ns?ax diff --git a/graphics/pokemon/goodra/hisuian/overworld.png b/graphics/pokemon/goodra/hisuian/overworld.png index 5bc1d200c89793fc762de5f4840f0f5ab2524f4d..23f160b786b5596a9ce013173e142974a6c10505 100644 GIT binary patch delta 802 zcmV+-1Ks?%2j>Qm7#0Wv0001UMu)cm0004VQb$4nuFf3kks&^R0_90WK~z|U?U?Jb zs~`-8B_M1m@Bh4Ktzezq8b}@g>@(AJ#$G;xD-dJsvV84pU;8r_U^n^8`$c}!9U#Ic z3SFL33cubj@|*66D+&w>N9!}^I&tDA^$%CM{+f0=a-Z=SgaiuBW%f8nq#zMPqJ(4& zaX4{M9ER>QE?r-LS7-?IxF(n+4#LsMHHQ@wU%kESxM^h=kDz3p5G*TTm_bYpNcW{rwjs^@eo_hg_dhG z-KRWoT~etO$T}q$*Dml~;ige;mVTFq*7b2_(|yVX>yiouw#*_Y#iRN2y9$Wzyhg?eMkk`&w;%9!HsfV3AgZb=TRh@Y?~j=dug}aJX=O zDpY-4VY|S!SAfEh%ud4PsFQoEU{y(<>-uQR#)b(ZPaEKHTq1bMhMrpn&x8jziU{jW z)n=_)HOA*!sW)xeo?BJl1v(r{`#_33WcW~fa5DfXq^;)~{0V1{Z@WP3Rm=7LhOInK zIC{N*2Q8ZV8Nri}TJ{wSJl5xMmKp8XW78Zzx0}+hz!YrG2vneP6W9lc^1(&ShlCH@ z!#IFN^<$m+*MZUSBYj1m3v9mhr_SN|y9N1->WJQxS2><694Kl67A!2j}(6h(XE4r7a-`h>q=GwNzlG>FNGNud|Zc%1QT1${n(~ zc*4I!Fx`Dyq_59HoLdtBxmJiYVk2eV&S|V>3W(vi@_(F^O;ZW zrje0QmmynrEOy?Y)AJE_2QYya;0#!#-a;@nPTiiE7*)L~iU!H)bwg_}%{Q7w06hig zJ1Bz3rWEDLgE&h?k{ATK4$Y-Ty93abxk;Fs^JgU5+_9Ie#Sc)ll;|%&%Q=6I!2bCL z*CSYaH}HyZ5ro~m;xzjj>$T^JF|rT;0IAgAB-`o3TesSGaBx6{t=4}S(YC5XaQ@Nk zfR`vCyAjw=44QTxpn3;_QQD3CMFye`OCwf&!?xx{vn9%1QjMdRRX=9YdlX9_cXk{* zPp4>i0DTiuDM(^(2?Tq)X+nRrotYvE7$|PEJAhSqMqp#M%b$^8gF2}d937$o4a-T) zg~XXHQOVvfl+;`~_7#z@F9JQ@a2F002ov JPDHLkV1lU_tYiQH diff --git a/graphics/pokemon/gourgeist/large/overworld.png b/graphics/pokemon/gourgeist/large/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..f2184b2cfc5642092ba824963e6af6c2affac397 GIT binary patch literal 949 zcmV;m14{gfP)Px#1ZP1_K>z@;j|==^1poj5Cs0gOMVZp1Ga?veRXq?85MUA&;9E|YFEjX)aH?!i z|I;P)?3=KJKu9(wmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdo zFc^kS9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~= z`BAllN%F zSG#Jmm~f7(*=ts?*Ru5hgT;hyHDe<{XGrvhCX1nFw~~PoU@$ZqnhdNF8+I!gSPgww zO(qwhl6x#+g9^4{L%`stjA=e5TQr^yXt$I>z!;l=Dvnej64njLzBhCu?|>Pw(gaX4k?BBbI0aIs<>w)Aq!l1Pb>Vb^Xg3j1rk(#YxV)eHH=< zYiR<4_X5E0kU&-TJAT0yqah%dE6|FPu3R3)l5sD4&|CmVNrDxDjEe{DpOT3daH<3b zl)CWU<-KcB@no!o=Sc=VD%L3l{A8>N2;K?sg7eu}eI{^D_H0f0{M!8CzRnxQT@Z|@ zo3llSlU%@$LQOz$E+8A;tO8#RxLJ*NY>kE?@P0ikY(RQ^&3!s@bA|(Yl?%+Gwk9As z6A*PWBdnzaoM1Ax_5r;RqRqn=xnv*$23$B}NPAbAz}bwp*NQ;KQa}pNeC>Y;F=OGL z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&C*?@6aWNj!yl!=LC5 zEt{p>NF672>@x18#P^)ynCz^>F>=&n6Q&=&d{!EGlHJl3HaMZ;elN8N52zQ6L*!_u z_Sx~>ZCVV}9L{T1Km@1)BEVJ9)&meW0w7P!UXFNa?;PVRsxI_r0b}7p- z+)xL+Cf1Hb_-wn?1h(7n$_*!C11ngT*74xW=@EejI?|^%4!?{Zt4aZE3SkWXNdfR1 XMtVHO6&GWK00000NkvXXu0mjfL?)cf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/gourgeist/small/overworld.png b/graphics/pokemon/gourgeist/small/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..f2184b2cfc5642092ba824963e6af6c2affac397 GIT binary patch literal 949 zcmV;m14{gfP)Px#1ZP1_K>z@;j|==^1poj5Cs0gOMVZp1Ga?veRXq?85MUA&;9E|YFEjX)aH?!i z|I;P)?3=KJKu9(wmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdo zFc^kS9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~= z`BAllN%F zSG#Jmm~f7(*=ts?*Ru5hgT;hyHDe<{XGrvhCX1nFw~~PoU@$ZqnhdNF8+I!gSPgww zO(qwhl6x#+g9^4{L%`stjA=e5TQr^yXt$I>z!;l=Dvnej64njLzBhCu?|>Pw(gaX4k?BBbI0aIs<>w)Aq!l1Pb>Vb^Xg3j1rk(#YxV)eHH=< zYiR<4_X5E0kU&-TJAT0yqah%dE6|FPu3R3)l5sD4&|CmVNrDxDjEe{DpOT3daH<3b zl)CWU<-KcB@no!o=Sc=VD%L3l{A8>N2;K?sg7eu}eI{^D_H0f0{M!8CzRnxQT@Z|@ zo3llSlU%@$LQOz$E+8A;tO8#RxLJ*NY>kE?@P0ikY(RQ^&3!s@bA|(Yl?%+Gwk9As z6A*PWBdnzaoM1Ax_5r;RqRqn=xnv*$23$B}NPAbAz}bwp*NQ;KQa}pNeC>Y;F=OGL z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&C*?@6aWNj!yl!=LC5 zEt{p>NF672>@x18#P^)ynCz^>F>=&n6Q&=&d{!EGlHJl3HaMZ;elN8N52zQ6L*!_u z_Sx~>ZCVV}9L{T1Km@1)BEVJ9)&meW0w7P!UXFNa?;PVRsxI_r0b}7p- z+)xL+Cf1Hb_-wn?1h(7n$_*!C11ngT*74xW=@EejI?|^%4!?{Zt4aZE3SkWXNdfR1 XMtVHO6&GWK00000NkvXXu0mjfL?)cf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/gourgeist/super/overworld.png b/graphics/pokemon/gourgeist/super/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..f2184b2cfc5642092ba824963e6af6c2affac397 GIT binary patch literal 949 zcmV;m14{gfP)Px#1ZP1_K>z@;j|==^1poj5Cs0gOMVZp1Ga?veRXq?85MUA&;9E|YFEjX)aH?!i z|I;P)?3=KJKu9(wmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdo zFc^kS9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~= z`BAllN%F zSG#Jmm~f7(*=ts?*Ru5hgT;hyHDe<{XGrvhCX1nFw~~PoU@$ZqnhdNF8+I!gSPgww zO(qwhl6x#+g9^4{L%`stjA=e5TQr^yXt$I>z!;l=Dvnej64njLzBhCu?|>Pw(gaX4k?BBbI0aIs<>w)Aq!l1Pb>Vb^Xg3j1rk(#YxV)eHH=< zYiR<4_X5E0kU&-TJAT0yqah%dE6|FPu3R3)l5sD4&|CmVNrDxDjEe{DpOT3daH<3b zl)CWU<-KcB@no!o=Sc=VD%L3l{A8>N2;K?sg7eu}eI{^D_H0f0{M!8CzRnxQT@Z|@ zo3llSlU%@$LQOz$E+8A;tO8#RxLJ*NY>kE?@P0ikY(RQ^&3!s@bA|(Yl?%+Gwk9As z6A*PWBdnzaoM1Ax_5r;RqRqn=xnv*$23$B}NPAbAz}bwp*NQ;KQa}pNeC>Y;F=OGL z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&C*?@6aWNj!yl!=LC5 zEt{p>NF672>@x18#P^)ynCz^>F>=&n6Q&=&d{!EGlHJl3HaMZ;elN8N52zQ6L*!_u z_Sx~>ZCVV}9L{T1Km@1)BEVJ9)&meW0w7P!UXFNa?;PVRsxI_r0b}7p- z+)xL+Cf1Hb_-wn?1h(7n$_*!C11ngT*74xW=@EejI?|^%4!?{Zt4aZE3SkWXNdfR1 XMtVHO6&GWK00000NkvXXu0mjfL?)cf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/graveler/alolan/overworld.png b/graphics/pokemon/graveler/alolan/overworld.png index 7ff3687da6b74526eac23acde7bf149df4865c8f..d1c9b50f17ee72e020cd673188203abea6c2bf7f 100644 GIT binary patch delta 687 zcmV;g0#Nfp7#0Wv0001UMu)cm0004VQb$4nuFf3kks&sJbV)=(R9J=WmWytr zFbqZUV?to(|G#&y69OSIFtn?!RAE&}&2f_J2WE!hvBw^J?6Jold+Zk(5r5O+hmAzf z1^N!Jo7dd+|J;Z*@Y(UM19Or@W@({y$p07qvJKwZW&f)=VEKPL|41A$%Sj20dk$C& z45}id;)+gS3UK3p97J{wNg$DoQN<*3x1V>s4Y0`5I4V;hzXF*D>KurLVqk$jmC%>@}G~gsWeH!Xa;8MiPP~l~IZ{0#krBSA>gQ zdx5b~OS5Qo2?blIcpG5J(kKyLIE|e~E4;^SMMGtAiQ3h>S&K}g zwP61mtlY(nMIn2^l3y2N3UK47;f`m4W=oQ~Zw=FqOV{T(!H$nGa_7v-U7Yz=;zpna zSo8h>vKW$oxG||~d-#f5itJ!0ME>C1PWqMm7y(SQB*~h@Nx(U$5}y^>F1pE68``_I zylYOAFPyB5&X}T6W*hVv^D|!4yPRb+ds&??%_&EQaBzh5WKM-P4*l+s(wS#c!c!+_ z2%K{?$Q1IV)!?`ADMyC>@Qn0R>R(4-&D#l<1&-B!l<)$$;2N}8aP(dA!8!->CVZ$= zy#Ow_6}k^Iz;gEYA&($NsDR1woe* V0)+kT1-b>07zqRe0002CwraMKE;fHoNkl^o z7)3UUL@jp{NvL+Gyn@}pFHjFz9R-2*0!1GobKjtQA1Wk8Qh!h-C{PqA;9I2Mo%DUY zBMHDc&T)=&{JZdiQ3A$)*?^7&L*`y*6aP%*e{YcOZw85=y0Wim20REmLHSfX^SggF z>H3XPkWbD1fQYamr>-TR?7fH_p%X+i&Hm@y3VPukhXC1n+_E)PdYfai>vbS`w|HZF z!H+2?gd-y;4K*)M`P>Lz6r?BuVd|7=o?Ani`dSwPb^40ga&EfE%ZC+_@!kjqxMlj7 zU?W&dTs@FV*B6{>zBh(4(p6FCGy#8oPMIAa1Z?DbQs<{RC$7OXCy?L}w}Q%0v;9H}Qq>Tl?GXITurX9eG_2QmL1l-o`INa$ zNixh~SUSrz*G!Yx3KCMtso1OJhb>b(^^D?+=F}Y<%|Umpe9qO-g%Jda+GBsYKKp@( zcuiJ>B@+x%LU9wK?5fA795LI0zlBl{yQ?>5Pfes=Q#`?Ph!D$tV|_l6#_a)k`vLOu zay_45U-d)QB%ffA!6zz&NCv#QcX}ZGbRAt@Z{rE}`8WQBRBonY2HuaSGGf7e$cvuA zQJ;!N|2Gcn1s=knLjkNJ>!j}Mios{JH`=-sBt*fawa2@%9E z@bYj#FR+IiR*t#5*y?g2bm%$)i#Hjf diff --git a/graphics/pokemon/growlithe/hisuian/overworld.png b/graphics/pokemon/growlithe/hisuian/overworld.png index f9cb0ef6cca63516654e540186a2a30528cd66ea..fdacc913455963d38df365b31b00df81a7c3d59e 100644 GIT binary patch delta 615 zcmV-t0+{{N1+N8=7#0Wv0001UMu)cm0004VQb$4nuFf3kks&{SElET{R9J=WmeF$S zFbG7w5*AjP|Nq_svgURY1e4|=Gri^^nfefGK`Yd4yW)x~uDIfgKNLjo@lOZ!9xBZE z$AemLk;06BI;gc4wK(J3#vHGZ@i#*p5_%-#8}}9}jCr=V>E4S$dT(owWSm(X*49l< zI3?#REFk26B2V=7Ws?&w+Z&(1gi9RMfJVpfIMB}kUgtzVoAW%aGd`Yvp*MW3 zW_`?2+7#G|qcG-V=9~(jr*+0hlC)Q{fJFr%M=AZEz-NUqr}13ht$)#@Su%d=n;wO~ zK_N%s*1)%lrMw zkK+*TFM!H&$R)ffZV8jG1NklmQ`GIaL`z(TgAmmhf+Ar;85EJ>Yqi- z!==>M%kwTTeRuD?7r}xqx#1qayLb8S`;M0b=(m3Bw|~~mLT~?d8|XfZ=c41P_Z)wK z4n()CdanV@(MGgFiXl%#d9_81o&<@soh2!yDL=ti|G-AEW0uO+O+Tvv|&T%;E>VrkIy%y z9jcyn*u+IQ{H~rsTnURm0;)w#s}pRap#2R52x{%JU`AX=2KH> z8s}}v(>B}=22ilzrVH)+(w8~M{6v%p<<7&smNbv6P+tq@QPRaNEap)XF$4oByr8yg l(F-eL-1_aR(hU8V_6uxz0d((~e4_vW002ovPDHLkV1k&dKWG2| diff --git a/graphics/pokemon/kyurem/black/overworld.png b/graphics/pokemon/kyurem/black/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..2818f3b943b86aac3721b008282dfa7fc19898fe GIT binary patch literal 1552 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 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/kyurem/white/overworld_normal.pal b/graphics/pokemon/kyurem/white/overworld_normal.pal new file mode 100644 index 0000000000..0f6dd354dc --- /dev/null +++ b/graphics/pokemon/kyurem/white/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 27 128 +16 16 16 +48 48 42 +62 62 66 +80 96 96 +96 96 96 +80 96 96 +232 232 248 +236 220 10 +144 136 120 +239 173 74 +136 152 144 +184 176 152 +182 207 190 +196 196 209 +232 232 248 diff --git a/graphics/pokemon/kyurem/white/overworld_shiny.pal b/graphics/pokemon/kyurem/white/overworld_shiny.pal new file mode 100644 index 0000000000..922002fe5b --- /dev/null +++ b/graphics/pokemon/kyurem/white/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 27 128 +16 16 16 +48 48 42 +62 62 66 +80 96 96 +48 75 81 +80 96 96 +232 232 248 +237 90 188 +90 115 128 +170 45 128 +122 147 200 +184 176 152 +196 203 240 +196 196 209 +232 232 248 diff --git a/graphics/pokemon/landorus/therian/overworld.png b/graphics/pokemon/landorus/therian/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3b0219572d506f3f7165780817ac3745ec2725 GIT binary patch literal 1265 zcmVPx#Do{*RMVQc_R8~}Ne~azy_QuB379|djRTtZs7xsgWS57O`V=>`SN+u;H_{djJ%79L>jt|ueu67EzRGF=-0}TI0@ZJJ>&6EIZX6rjFr@X9f@|3Al^UGj z-xaJfas~@Kzwf)WuRGGiXYYFabnF)R#PB|e?_fTH6Oo)V0ti+hd=73Snqjq%0xJJq z&J`rRo+0teahUKW!F2$4FkOJ6WI|af4AWQqfP=xE_daw}lU=~GD*$iM5g!__7Klk>bqo_NFf&YvU=j9X1Xaj= zi3=A%IkrS^^q~8ND|)yd@sXc)N*P7gl%`~K>?Zh-FmM{Ku>Ri(^n#18jD@*%@}q%t zI8Zs)Xuu6WU4>C(q97i2WP%UQ!juROQpDoQ2Y(WiP$BsiKSBsinnus!R|1cCH#Cyv1(U-WE*P2BKK|l7bN8Iwemf#4W#7~J3u*u}a z1h7#v$O?8T={s%Zd%SU!Q<_DmB<$sA7Q+s-{I+%|IE>1t&~s-nz;$}m(3n#l8K$Pr zzTs+v9JA7lc&v@kgg5i69?xlF$ysrK?VPz8JD>MGWxV!1FG}^h0T4E)!g`;_5jL0WSE>0YJP^ zBNPiC`k_Al>vJ4Mwy74Soc!kik~Y}-mh@2BGZ2HD z0Fb(@P(}MKwz-&H;=GV&sr-@fSAYY*l8e@;K1EzT0)&7ZZ1|i(3_T^kM;~_&oy44& zaa0{~ds-FEkft!W&ideKA)HE$-2P!a_%n@3T%C zi4AVA1i}=GfW(pibYo+HnM)(OS9-kT*9dY)k9{y_23SQZI*pm%1$2^YMf0OwBJ?m9Gd3xYL3 z-FcVgz`wwx3aeFY(Q9xaWT{FktRu*q$Ld#;}bv;bVby=_` zOROiTzm6^q>hrq*+j;bc;1!^(61ZL@`%m+Mu$e5ep5W_vv0D>-MmF=i*V?W<{g;0l b{}1C2!;3IeNO}xI00000NkvXXu0mjfg>_R9 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/landorus/therian/overworld_normal.pal b/graphics/pokemon/landorus/therian/overworld_normal.pal new file mode 100644 index 0000000000..68ee7e89de --- /dev/null +++ b/graphics/pokemon/landorus/therian/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +84 86 84 +109 127 139 +237 237 246 +198 198 211 +22 37 14 +142 85 23 +219 152 23 +246 131 142 +87 78 43 +212 99 49 +225 80 74 +38 37 38 +214 195 61 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/landorus/therian/overworld_shiny.pal b/graphics/pokemon/landorus/therian/overworld_shiny.pal new file mode 100644 index 0000000000..36e4944980 --- /dev/null +++ b/graphics/pokemon/landorus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +103 64 40 +103 128 140 +237 237 246 +160 184 160 +22 37 14 +158 97 23 +248 160 40 +229 89 32 +38 37 38 +158 97 23 +229 89 32 +38 37 38 +214 195 61 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/lycanroc/overworld.png b/graphics/pokemon/lycanroc/overworld.png index e625ff82502fd85dcca867b122c78d110ff6fe2e..5b8ebcb1f6aa22d5bf381099cdb22f04f16f25f8 100644 GIT binary patch delta 801 zcmV++1K#|k4BrNjFc<(ZP)t-s^Ado^qK&wyyLht{$JrZu>3!u8$nf8a3Oq}>5_(+xncJ8*@ZoBQa|HXKB zxXypTGVHH87v3DM^B=GrVG|GL{NFo}Lx?eip+bYRFXS8*KXSm}pIauiu>(`i-g^;< zLs#LH6V0Vr{B?<(2Y;8hxd==|Y39I?Q<*EYxO25iaw5sIdjg%{5;vR}CL9GG)eC^sm#dvuW# z@iJ3raTI8UvV}sR1v=}gP%RFDC8I^*9_7+^V8T(^5*{~NWq&NL9UcN(k!he0BeN9Y zggcImv!OsBzMWUwDVNSfn3e~NjKxJ@VCfR8F&~?~#U1M!f#PUu#o2)w7l9HUxLD8q z!RD%vpKpOrKBthuMPbgVCTuoB$AKA#z8EzywYKuwZ&@tf<_C{WUhH*hi$kC+5iB<< zcl1vbauG>XLQUEyNEB~N-QrI6%09HcPVl`Qv&A7$ z6iSo^OFq4L&q0wSP4X>pUq}{TH|jjRfFp)@ZG-(3Sv?s2-Dwz=hpq$2iBxOS5R*H_ zVb8xhaejgWa;~!#-UyILj2)1uaPI1RPch=0y`;HzI(6Xa!IpoWx%&7A4|_0zgYBGfyb5gtr&aDzyHPGy>4_SGq0L`?v0&`uk)P8 zH^QAfX1vJFufBcz-nacTY)Rm;go920w%)}Q9sMiF|&@p-+rR9pnCr514rhh@$pzr-|5sZe09~y z&If5{17%{LC^2PPs_s#jiFp!p&VJ`1#SI~mF2yp;eCvvKObt@gII?=PpX|B4_hTMt zZ8)*0SUYjzrQ(Ehz6<>V@`_6)8lN@_eo+{+!|CQB!%s|ezitVzpzgwAQER^r;0WD`HsPE^2L@bzN!WMSj604i>9-u#js{oxO5-2w2sZ=diqVEVsbH;WsK;vIa!C&l*?ph6uwa2bl}RZ zY1cnbJNo$TuLoD21g;ONmSNiJ+Tj=S?#29qhYK`YKS^Et^kGlxM~kh>7dQLJw*_yi zl*um1E)2M#yI5I|^?!XwRLlgW=+)=%Kfay1;ElKFq?*8bwr4Vhx3-;btnSS@@^x{| z42Qonau07TKk#sM=+2Ao-51#JKDom#vu@@ufr@3x`+f>tUN+(J#YV~aucDl@wL)qv z%e4B<8_OPA6e;lT(BoN?ZITiFBFZTA(cTM{dpcK5dmh3SSts8;^>}!r;bZ?x7aA4A zC!SHgmQvaj`mt_h^_-IRGD){zAGvVb5a^rGg>IP_KK(pb&9_QLcM^Z&dG3>sU%SP& znJb8OY&W{$Kk;hw#q%c*W!RL-I`}P#n%p|$rAT}Fznh)HG8f)kML(R&(0k+tV{g}! zb^DI1y2TWEY`f^T)R?_b?#<8VGiUeTuejkX)f=?LHrGnJ{7&VA1#47`WuI6uFNv0T zl4!m1`mdKI;Vst0D3%@)c^nh diff --git a/graphics/pokemon/lycanroc/overworld_normal.pal b/graphics/pokemon/lycanroc/overworld_normal.pal index 87f56c95fa..f75ed7c8f8 100644 --- a/graphics/pokemon/lycanroc/overworld_normal.pal +++ b/graphics/pokemon/lycanroc/overworld_normal.pal @@ -1,12 +1,12 @@ JASC-PAL 0100 16 -255 255 255 +243 18 128 199 162 141 184 181 175 92 170 238 128 128 128 -88 146 214 +255 255 255 85 129 197 141 116 102 178 98 156 diff --git a/graphics/pokemon/lycanroc/overworld_shiny.pal b/graphics/pokemon/lycanroc/overworld_shiny.pal index 03f98160db..fe310eee21 100644 --- a/graphics/pokemon/lycanroc/overworld_shiny.pal +++ b/graphics/pokemon/lycanroc/overworld_shiny.pal @@ -1,12 +1,12 @@ JASC-PAL 0100 16 -255 255 255 +243 18 128 136 168 200 184 181 175 92 170 238 128 128 128 -88 146 214 +255 255 240 85 129 197 96 120 176 248 152 136 diff --git a/graphics/pokemon/magearna/original_color/overworld.png b/graphics/pokemon/magearna/original_color/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6c49271e76189adaf001c3e726daee6590eb55 GIT binary patch literal 890 zcmV-=1BLvFP)Px#Fi=cXMVQc_F)S;yN<_nW?CuoA2dw=i}hI zv1|YU0A>!YjsO4v5MyCZb^rhXAOHXWAOHXW000000AjiB`Tzg|+(|@1R9J=Wmy42{ zFbqWzyRxlf^Z%dQD?w5SvYnW=Go7hOb|FWyul#13{@Z{1Ek-b&CJ~t?)`tO3JEsBu z;@i`D{b^QXDWwS8{mJP~P7KcUIX{b0+R}gJR;0*GCXn>@fA;Lg^)rZ8z-Og zT_Qc?eaLrxAqZ+wkIy+s3U*NuC%DV4p{+M~gsVOjE(^wJWrno5_Dx7BX_9^d9d6yT zeMY$Hv%*8If0`T(yoPMo>NT--z{cG!(5_9Jg%Pd-QML(8{tReyRFKntRRr{SN}`r( z2{t*5wd_U$9j*$$;qmS2dy9)Tu#9mC)bcULQ}TyUhfCr71%Y3gD+0QFA0lI16@HITzwYiK$c?pvze$G7oZfVHH@#9gY=FmpXBGn7_c)M0u6Axy~{Ev3#@6vO!ME zvd|#koLaEX?R3a0u;jv(Npj|=1LYyUbmEH_|H}kk)nkO6h&|4_L1A#qf>Fw4!EwnE zCF+6#2 z6FhKRP+#;vY6&s=JGH4qu*daqMKNa_HHmVLbQMS^KAn$a`Xt8V#>GkSz-4ldb6YJT zhTwOB#>7|6PGnj14Y%p0ib;H;%wR%pow( zYtH(avztJh)10#&*U?hAxjOVXpZIkd>T!5L8ze$rUI+O0s+w`x%j+o5qx|79-{6>E zB>2(|PQx5ye0$-<-^xzd=DNwOLbB>+Gs;o;DBnEbaEJ4X>lR-S#yK1&t)ylUH?_iV$4}k{_Yt4E0(*8dUh3(;>F}@FPhk=?Qm)W1 Qm;e9(07*qoM6N<$f~3NxDgXcg literal 0 HcmV?d00001 diff --git a/graphics/pokemon/magearna/original_color/overworld_normal.pal b/graphics/pokemon/magearna/original_color/overworld_normal.pal new file mode 100644 index 0000000000..5a44a54707 --- /dev/null +++ b/graphics/pokemon/magearna/original_color/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +49 44 43 +179 74 68 +203 98 96 +179 74 68 +0 0 0 +232 227 162 +203 98 96 +186 177 108 +94 84 82 +70 153 169 +168 161 155 +239 229 115 +231 227 224 +186 177 108 +0 0 0 diff --git a/graphics/pokemon/magearna/original_color/overworld_shiny.pal b/graphics/pokemon/magearna/original_color/overworld_shiny.pal new file mode 100644 index 0000000000..167f426783 --- /dev/null +++ b/graphics/pokemon/magearna/original_color/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +49 44 43 +90 85 84 +216 120 144 +179 74 68 +0 0 0 +206 200 197 +135 129 126 +153 146 143 +105 93 91 +70 153 169 +168 161 155 +232 220 110 +206 200 197 +167 157 71 +0 0 0 diff --git a/graphics/pokemon/marowak/alolan/overworld.png b/graphics/pokemon/marowak/alolan/overworld.png index 07dc3ff981a167dd8cc14a19ab630882e34be1a9..655c37491ef3cef51d5c458545acc2814332c1f1 100644 GIT binary patch delta 799 zcmV+)1K|9z2Ehi97#0Wv0001UMu)cm0004VQb$4nuFf3kks%s?FfdRk*s!4Z@H8Vc za6nKf*svI=h)_s~sDO~H<-{*f9WDR>0>4Q_K~z|U?Us#>tRM`9$5OzGj_?1rw=MVw zRd?rR?B5j=jtJr?eN{0BVC^BmBf+q>Yb%7fPg{xbypFc*CgGy_fy+;Gh0HN&d^)7-hh zA-L<%NVwxKhf-QSqGj=pqgw?!)4(N1?6`PXOg0HMkCsF4LpEvNv0J|D@VB`%#|MxG z>ow`)HIH=y*XPS29@%6E-k2hH97=Jp9b9uP&blt^Hx2B6xoN<6dPMlsHgLzc_%=sy ze6mSu^OOYF7`WlOf%k(xrNKIbw;W*~t$`b^BbG{=p*`Xi@B7s5;9=lN0XSG={tMh~ z@;=}ZmobHC>pO5OL0)k(q?!$4yyoi;%Zml>P83w3 z=nE4bmvRDsPCHJ9e&P!*B9XskeKja}{l;5^QLZI1oF|5e6ux3enu)w#|5e6QB8=c6_F d#1p?0e*l1-Ci+<<&gK9B002ovPDHLkV1g;7eTx79 delta 783 zcmV+q1MvL82C)W^7zqRe0002CwraMKE*gJPGfy&(LeuzpG$S)`M^Xf9I5530^nZv`j7Nr`S1MCT3P0EW3A9=;OC-DmKstfAj_?aDoL8GaCsN=2IMmK zgRq>*%d!e(2xU`QltG~;Lo;QVX93qkSY4P4PtZQxSygxp3N45uH@GY`iQzhrg{LMW zkxGs?6T{{nLa@Q-u;U7kTX3%iO{sr6$Z@|%E1G2!b#~-69@lZXlp1P|TM(KLC24Dr z<6#mYmuhk;6_96%h|B8Z)w7aRt_(Pg55UXL{$+CQ@~no2(i(>aRXW4hvf9h>a7+&f z=7n56-vwN*6TfvXAE@|~Xj><2KjKtCy$pBg0kM~5B8~ibZ2%7A`jFWRiUWV4wX2OL zEI>R;Gd5g$A(d7tT_r9DM#whvUqY6qp{^pvQ#C@iX`ndljr94u@2uheU}Ve~8u`BaSV1>O%?0ntSihsS|EpE|6*Pq{ntj7OwK zOaqI!Z6{L^%11s*VgDxp%kmy$~X%fyK99Tx98| zNx(4d{4FQaOn@xvq;A-FrSS0ZC@hKK@#Q$KhbG=?nb%enP@8 ze4G{Zd^W%kcolsY@xp({7Y6RkzYW|D2To;$g9t>5kiMTJ0z%>l`i(gq%4frhJ~6I0eo*bPB@ALvH{HL{^cXXzmW&xDBZK&YUFk ziggYLgUKPNP5q zxN&aSB*=Icq=aWcUUetSO+eGfI`Wcr4ts;-Vm!hbionE(QGsYWVpIipfaMLF1Sh=3 zC^NX~4q27kfO=`>ea$+Dy+PtVqDBuD_(cx<5`kzs;?C3pEN|FKm)~`GJYZ<{Giqy zc;-*QcE2T%W`=fuNsbo-9vxJNy+PR<S0yczim zZ!4a$cS0T{Vn<~;7hhgqDHYHB2@vsek!FTdcRJ|5S-E>VhoeEl(q_3i;=W6jCEl^< z*pf1qn%+4aVrLS4B>F@loXT!^m6un+Gxr*xoJ2khG3{7?NjVhCnbmHvy~DvEDpM9V z?1>l?kELKrqAvr`UwFa~mq%!sVbTYtG%J_?XP%@Vl^KM3*DO{fY0Wt)P2?%yHHaXh8GdcnlaqW~k_wDG%1c=x{VB@%vq_ zk3h6R9(9~_33LHy;1H;-5eg|PhroeLF&C~gV7R20quyg+8w`vN2ZP#Del>x2TgM&z z;W&Sgn>b5>3CA6+Txw|Kl3(t4{gnD=m{wRDI}J5|Bn|`BfXP4!>jf^jL;2wjnolY6 z1~hQCW8B>4?|AuR8(np5?iD@`pMb&OyTCgD2SIG1X?n)vA3Cx8~eu;*MPNw-vS>l&*g3LN7uWl<2LMRviavU vWX4`7|7EuZtPTDa_&;55`CrFw0X6Vn$HGw8Gj)4#00000NkvXXu0mjfjREz# delta 1081 zcmV-91jhTm3&IPKi2)?BiWC8Vln_N*i>d*I=Z|oc#B%4ZOZ3vB`)2tzPctF2`>!Q< z91aHS1Z{lLC;XGrhc4N=pQsv8_^0req;e8*a$OfKy7zou0+P(0ef+fqkHf)W(--*j z{e*;H_&6)*`D}n8@GAN);)VZ?FAUt7e;c?R4xGvg2N8%AA$>nd1cqXNlWIWED{cu$ z6zYYKQ+I5CjVBY(^p(sj);U}n2sv{|O!+)BaSEJs=oEyJhu#1Zh^!(%(cB%laT`$e zojFP773&-h2A=_v2-Ks-rfHT28lMetYCQ4OJ@q`zB7t<|7=9SI9S#O%fDlfpapaX6 zMSiLAGlZ%@0(xGtNq`A|b}2bb@uIuj1dVSkpkDFP%vhe8^$uqPr&Pucg(L-<@R&xe zoJN5JaO2#tNs#d@ND0q?yy{Mtn}DW|b>t=M9QFpu#dw4>6oH8mqXN-%#Hb4H0LvRT z2~K#6QD$(}9kMF70rk?%`s1z6s&Ne~FDn`5G| z>V8^o0@@}cnfE2@9F7JVk;if5fRp>xxwI3_)+u~h4P)^-TlUv z+kk37Gb1iftasQOgbI(B1D8*yHKG;b&g}5M;91{D*fSppXdL)pR$LO$fd+~>W&A`! z_(82Z@XVip?S4ytAk7Tzk{mAvJUXZjdxNq!$i2-@?s1u6Z1)8D*fq<3QSN;{EkBi0 zc{B1C-c~$g?}R)^#E!~xF220JQYxPL6CmQ{BFzk^?sU+9vvT)#4o8E8rOk44#C?}4 zOT1&zu_a|JHNA5<#Lgu8Nc4$9IF;S-Dle~sXYMsXIf;CK7-HJ7l5!}NGppTTdxwKT zRHiI!*b^}(9!tTLL|+D=zwm?~E|1VM!=w*PX;v=(&pb&#Dl-W6vc2rsbKwT3RV=)z zox$N?kYbR%4F~e261P9$5g7}xUP~T;EBEm`V-$#TS4~(nd7V<(17N@@fa|K%uvxUQy#2?(cx%N z;`h5;AAx9tJnA^<66gZZz#&juBNS3p4uJ!gVlG@~z;H<~N4>|uHW(Nk4hFTQ{AvR4 zwvIda!*Tu~H*uB%6OKDtxzy0eCBNM9`YH9#Fs-nEHg+0nNE`;L0h56e)(c#4hw{T6 zG@nxB4QSwO$GEx8-|_OtHoEHA+$($>J^_QlcY${R4uaT1)AWqTL!L*@b`1S87@Rdw z8+$PDIIIC9e-rrVz#%BC`f{R?Q*VIA{EJDXHujGxt^sQUzXd*Ap3B?fkFIx9$8Fft zWb@A~X~>Md{>yF+SR4E;@PE4A^1qJV0&3vDnaEJay5dxg00000NkvXXu0mjfmUq7kx;zM|9|kPTiEdic#_n8xD}O?vN+!y8aI z=@sts6jmFe9#3U|eb9RUq!ED(?re`oB~p9bb7=8!Wr%tl)7*TNeSkzRr8+mS<&ryt zgCD~KF1FJ`)8kxZMuUyl%T$lkMKp!b^EfwoOiq0a!(epOp?Hsb?dV|``gd-<&5oB!60Fpl;UGNsd5p2IKhuN(Kt?%4d7HyEbBQb{%Mf@Nfd&_M zXw;fv@#1NJa+9+K%<>|zWY|V|o1_8~jIs{y!*UWHSev9LJw^ zT~vL>_!=W^j>-g0V4V^ym1|16!;?^%_!gIk%zvTIX9%@%? z%BTzbg{`4VWWKzbOr5AW)29-iVxQ@>GNat+t=kfMxk)o`@l;;V;agJT22OTq5oEt#jl z2>c7qrVw9^8zt%aKIPRY#rPD_D35Q^6L;-mC%!1eZiP!jMZvOzRj(7#rPhT{ahj@J zw@Ud`${%xSDZkveE^67&xl46Us`Q!bRrqco`32T9f!vVrwSQ{Av0WTzb5X?X00000 LNkvXXu0mjfLxh;T delta 729 zcmV;~0w(?U29O4j7zqRe0002CwraMKE-!xqs!2paRCt{2)xDC_Fc1J>$rYt7c^K$y zNo1f@R&$V2)6y#S)m*^?;A`#;cudy$v#lt(qhvr${6+R!-j%(K{U86( zC@#3p$8)itGq}soyR_rU*w2YCn+wix95MDYhQ#RwXAW(4!A}k@T&OSDXbh%0?o!(wj*dP@$gW4k-o3i?ZUKP3$xq!i z4uRmB{qc!cdby;4Vo3)HZ_CyNEWnDZMatc(FpN6bz>~#fS;ItIwXWCIsk?ym(jio$ zVru^c&QlqV?skHf)!+t9%VWdJ@=3*vp!rE94%VVPc>5~YLct&a?I1-Mc0{_W9(O=f z4;mCDDywKd>uoBUb28{mHzFPf*eMfAjba8l(0Ct~86Z00000 LNkvXXu0mjfAOC93 diff --git a/graphics/pokemon/ninetales/alolan/overworld_shiny.pal b/graphics/pokemon/ninetales/alolan/overworld_shiny.pal index dfb053a961..0336fd62a9 100644 --- a/graphics/pokemon/ninetales/alolan/overworld_shiny.pal +++ b/graphics/pokemon/ninetales/alolan/overworld_shiny.pal @@ -2,7 +2,7 @@ JASC-PAL 0100 16 152 208 160 -91 74 138 +112 80 112 0 0 0 178 178 219 230 225 246 diff --git a/graphics/pokemon/oricorio/pau/overworld.png b/graphics/pokemon/oricorio/pau/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..16674ed09b22cc089cc80127897787de56b94e6e GIT binary patch literal 590 zcmV-U0Px#Fi=cXMRUcZARr*Xt(yGm*pPs5Xgfsjx4gKHkpKVyzln{qFbqW#f*nKB^!~S<9blWb*shS;ZW3Nrt$IKB z+u*PeuDIfgE3UZWioX#t@{->-@nAxq$0_leBCogbU7(wEcuey&&69kjk>c5W7w8qb zoV$~@H55FX9|FAt4i9mjdxCjZZqbwZr$DXH;ea@2{y~J{^`Ff*fl;ByX;~06;p8v&j0#;|YAr=R6ay|V>niIchujmW6?!~Cxxs=9+=}uDxcrDyoDd7#8spYR z20hLR+MU=S-J4>-<-5OgoDd3OGYYhMh{7t$Q__Z~n8&#@TYp+P!@us3HsdCbv9sDA z^HP4j>>lE6i!=PYL!|(d^9hv;$$;^cQOQ3C{ZY>LPVrBJO%fQlK;uwT;wj+)=aUL4 zr3x?QJxInw1WExG=SvdM#GS!B@n8J)rF_%m0-Ip$-{M3Rh+lGf%KWOP{{5A_`{UN; zv)@5SHe!O|f&HKh zs7F=(ZCt;8;OUYBPd$ePiN@I8%h2|BVq8E{RHMNGfZwFX_U=MYz{J@cOoOKNBfFEr c75uyS0ODjLg^w!s8~^|S07*qoM6N<$f;rnAod5s; literal 0 HcmV?d00001 diff --git a/graphics/pokemon/oricorio/pau/overworld_normal.pal b/graphics/pokemon/oricorio/pau/overworld_normal.pal new file mode 100644 index 0000000000..2121618194 --- /dev/null +++ b/graphics/pokemon/oricorio/pau/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +32 32 32 +192 173 154 +252 234 216 +144 128 112 +104 59 68 +239 183 188 +184 142 145 +0 0 0 +191 137 141 +199 132 137 +242 106 141 +135 104 106 +237 243 238 +230 97 131 +255 190 197 diff --git a/graphics/pokemon/oricorio/pau/overworld_shiny.pal b/graphics/pokemon/oricorio/pau/overworld_shiny.pal new file mode 100644 index 0000000000..4a3a9d46d2 --- /dev/null +++ b/graphics/pokemon/oricorio/pau/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +32 32 32 +223 90 124 +252 152 158 +158 54 72 +104 59 68 +239 183 188 +202 86 116 +0 0 0 +252 152 158 +199 132 137 +254 236 199 +135 104 106 +237 243 238 +220 174 133 +254 236 199 diff --git a/graphics/pokemon/oricorio/pom_pom/overworld.png b/graphics/pokemon/oricorio/pom_pom/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..42f23c505b5d918e1d81fd971fb88fea005b1fe3 GIT binary patch literal 630 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 VgmkJ-D8T>#002ovPDHLkV1gRZHT?hp diff --git a/graphics/pokemon/ponyta/galarian/overworld.png b/graphics/pokemon/ponyta/galarian/overworld.png index 683780312b2bae83528b1b921dae2d0c72fa92f7..1c37a3d1af7527e655cd759f65947b64d49b1786 100644 GIT binary patch delta 682 zcmV;b0#*Iu1>gmcLVxDoq{VH;L2+u;nbp0zy-3LD?&|*l003&<-g9w5Fqo+J^4=xI zr4|4H0$xc(K~z|U?U&J#nIwpuQ65kiv-dkSY90hUIx2-D&Sm~bd0=-b>WqlE)5 z57Q^A&Lx@gLw_NYtFKIWlANhlKLY{w6Zj=0(qMXxTLL+QXXlER8gmE)6F~~qsd3BV zCa7(LRpdd6jM($@8D+v%FWI6T1X zxeahk-N#d?eedQru^tbVzrH)vAj6kHbo!`|Uc5VOCkMM{tpx&S95;k(^%Ka4gP%Zt z2^vsn~frJx6lR|^DiJ*RFR-=IjW?YH{BEclV2d&LWiPys+{6~Zc zmWTV%*}KT4Hs2-!lQ-j!_43a8ui)nCd${xvaU+TSll7n6b?o3TWc)w&8zMU;Kv5P< QVE_OC07*qoM6N<$g5OU^?f?J) delta 684 zcmV;d0#p6q1>yyeLVw)Tx5aJ6L2+u;nbp0zy&R63?&|*l003&<-g9w5=DOzg^4^Wc zd71zK0$@o*K~z|U?U&uI+#n2uJcY=0`8aoTgvDMu?|#y<{< zSz|W^Ou0(5^-VYqn38`1Tz)Ft$y4BQp-fo?irnHj;0%M_1#tNyLNPKjECDkfpfAQq z;U35K(BuNRe33?xx1W)kAz;Q+sWH}C(k;$RC~}UL!WqW`Ya?Dc(rO5pa400`t7eyx z6dleR<;W~zTz`@oKNUtY^`!}4I0P!icEG^4fgeoF4I%fq8VCVA7*{kEpF@GeoHFt8(F#{E7$<9rlp>-uWFT=N%4 z26(xa0gkEXSPG@j-OM7E^P#fG_k`j&d^7-QrUiUX7#t^`bYtxCXM$;<7nyW{!$!v1$mM9|gA9~* zWN`$>D0s@VZGiE$z|Qz1!8Wkq2BJuz!I*@xe;T?+gADYz#S;jF3p*dQ+9TN?j|BH0 z5mrzi=0|6*B9m%=n+RO29)FJKPsaaVTr=$qlO>)aZn3{I{>{zA4!$Ad--%y-L?(TD S`=;Lj0000igP)& zArlY~5LiYuXIe$&ph@t`M5>mA!A>*Vbxq};Np&k7nL^4G0004@NklTx zBg+}mqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fk;i353T6A8?LtNZX;I4Z)&r$wX3~xCk{C zKgYXg9r<#FrtJT@|0ruS%0l5IE>Oj!wMMN;`!@;;gLy_7rYgitEjeq>B74P9PbFoT zZk}$G5$K!el%}9=iW@7qrOfDPm-jO1SJDFBO^zPJO$Nwz805?*fyvi_FYXATM M07*qoM6N<$f;}wk6#xJL literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pumpkaboo/small/overworld.png b/graphics/pokemon/pumpkaboo/small/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..67542d25d92002659ad86d6c57ae3f75a2f79be5 GIT binary patch literal 522 zcmV+l0`>igP)& zArlY~5LiYuXIe$&ph@t`M5>mA!A>*Vbxq};Np&k7nL^4G0004@NklTx zBg+}mqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fk;i353T6A8?LtNZX;I4Z)&r$wX3~xCk{C zKgYXg9r<#FrtJT@|0ruS%0l5IE>Oj!wMMN;`!@;;gLy_7rYgitEjeq>B74P9PbFoT zZk}$G5$K!el%}9=iW@7qrOfDPm-jO1SJDFBO^zPJO$Nwz805?*fyvi_FYXATM M07*qoM6N<$f;}wk6#xJL literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pumpkaboo/super/overworld.png b/graphics/pokemon/pumpkaboo/super/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..67542d25d92002659ad86d6c57ae3f75a2f79be5 GIT binary patch literal 522 zcmV+l0`>igP)& zArlY~5LiYuXIe$&ph@t`M5>mA!A>*Vbxq};Np&k7nL^4G0004@NklTx zBg+}mqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fk;i353T6A8?LtNZX;I4Z)&r$wX3~xCk{C zKgYXg9r<#FrtJT@|0ruS%0l5IE>Oj!wMMN;`!@;;gLy_7rYgitEjeq>B74P9PbFoT zZk}$G5$K!el%}9=iW@7qrOfDPm-jO1SJDFBO^zPJO$Nwz805?*fyvi_FYXATM M07*qoM6N<$f;}wk6#xJL literal 0 HcmV?d00001 diff --git a/graphics/pokemon/raichu/alolan/overworld_shiny.pal b/graphics/pokemon/raichu/alolan/overworld_shiny.pal index 1d2eb4fe61..4ea7665b8b 100644 --- a/graphics/pokemon/raichu/alolan/overworld_shiny.pal +++ b/graphics/pokemon/raichu/alolan/overworld_shiny.pal @@ -2,16 +2,16 @@ JASC-PAL 0100 16 152 208 160 -112 105 18 -240 225 38 +144 88 40 +248 176 72 0 0 0 -81 54 41 -150 141 24 +168 104 64 +112 40 40 151 117 86 102 68 37 -123 87 56 +136 72 56 112 72 40 -255 239 225 +232 216 176 44 29 27 78 201 201 204 188 174 diff --git a/graphics/pokemon/rapidash/galarian/overworld.png b/graphics/pokemon/rapidash/galarian/overworld.png index 1271349061dc62c666ddf986b32dd5e7c031a1a0..f81fceb9b0e598367eca18e5a57b10e99f0dd485 100644 GIT binary patch delta 859 zcmV-h1El=L2fqi9ZGSyUL_t(oh3!|-a^oNjOu&|)!sq}0+uH?S(!>HX%|qvAq8T@B zc7a`iWO})L;uD|v#67NW6Mi?YVIpu!csF8<@8G{~ATH}NQaHsY{^x}EA}$a(P&mRx zs=qb1Uw=S&KNRy{kz)M`E=l7W=}(hyU`F8f4EJY-i>Ts^s(*G8G{!|U^}%0O-@t%S zXN;@V{c)Eb;|D89zJ6UZK7WE!9|c06KmUMWm=gMuEWW}SUL#6K1sN_Wh{u}YT2LZ5 zB37(pU_h`hi3>8LoeG=bRiHuNSD-?34NPz=88s3uck~Yl7J^6$NjnN>IQ6OJtRV!= z*_=Z#!>hhEE`MVKU4jKpo^;dB7EEyH+p=oWgh%ssQaHo8M%CA^fe}FqW>3&pe1S6@ z6+()Er1+W3^Aa<>>cbfy74e9mlm~%Wq?PGY!<^wQ!D%&+Y-N_84J^$54R^Odc|_Rf zd#AKdz`TDjFD5<&B4LP^@s?nd1P>XMw=C2i(~L*?%<~-n47)w$UfFyzDK(%WBM5 zF6Aa-hI0c7N;8oNYB~vQ2EXBs14&kj86_@m9rp=!-hJOGa9K?7%G~m|HD)+lB=x6s zJZA$-HIQzcd}<}gubRb(7Nx6aU_db0cY`kWIjd?V8~=C_2V=1c*q(NC^Z~C94?KZ= z(x(L-f|G9o2!GBeTz6}`yvyagz!?t4QRdA@I_aasZ}>w2)xbA6g=mwJTiY>kC!EHU z&@z|q3O9QlH*{D{M>y-llKg|AbvrpkUb9gj&Y#<59|`UuV}hWq3AEEW7~?3gti(VQ zH^Wk~w6g&?w;9OO2!ZTT=8PvnNKg_S{S=60cH9}DPk(iLJ_lT#m2{ke>!a?%dHaLBrCIbW4yF~9{gxKGz=&kkN4fTb?J+Eef+iR*JKVgbnnB% laqo_QMEm>vs*e99{sJeVH7>Nun~(qi002ovPDHLkV1ga|j&}e6 delta 869 zcmV-r1DgE52gL`FZGS^aL_t(oh3!|-a^oNjObnKw!sq}0+uH?S(!>HX%|qvA!i<|X zyTGoHWO})L#%FxSXWYm2ZNl%4>oO5ICA>RA2=Cy(ZXm>U9Vra!8i)AA|D5pN2y0y9 zKw*f$I}Sx|{`u<<2=5O?fUgL#cJT;&^>Im<9_U|_Z(v5?@qY}@XNHTYB1cs_0UG0? znfl;At8ZXHs4Iq5dI>zk57r|2`gP6t{0UBd6bOC(`U8StN$5+`NzfTyN022IM7X3y zJk|`?f)YWBSh0?Q0l~f`L_|hA6*$AIK!d)og$m6zFu|>4)JU-0(LW^EvWTQ5X-DA< zr#`iuby*h8*?*iQnBi658sgYMmtYGQPr7O62qrl6ZCSNw!lQXRDV*Wlqw4F|z=)s) zt0(9yzQ7rd3L(WnQvA&2d5ald^&!VcMLZ%XpHSD`_niV`G{Gx#%is2x z;cSuApVIN14a907-8lKwN)TT)3jr-kSI@wJV6yK9UF>sK)k-%0@gfdJvoiG=9ADOm+lHTdmT4)SWU-p_J<|;2Se+2a)`KQqdw%H+hrdKZjv!T(AEUn zDG$at3M?xz(8P_fR4nam0M2a&@-#podz3lzNq-O$lmtgV1!9{WcLwNF-JbJ+yR(vx z9EguN3_&AOgzB9L^MwB4`CI~g&)y7}JKydGeEoafn8k`H@x0CsVQfP?Z^Y9cvhXXs zEc^(URyDZVdi%3YEohO(06Q6CBq#}s`x-fl1o5E*i11u8c*VqZcR6aEBrm`~wHBw- zfnJWu?D05P^%+(X63itu(TolPiM`w^;Z3qKdpE{Q`{%(Q?SzH{%Et43_ibPLB3>VV vulhBaLk->g@NnL{^B>XvIlrpoe;I!Pj_Wlv;>vKE00000NkvXXu0mjfLqet* diff --git a/graphics/pokemon/rapidash/galarian/overworld_shiny.pal b/graphics/pokemon/rapidash/galarian/overworld_shiny.pal index fa425be9b7..71b5d50d48 100644 --- a/graphics/pokemon/rapidash/galarian/overworld_shiny.pal +++ b/graphics/pokemon/rapidash/galarian/overworld_shiny.pal @@ -4,16 +4,16 @@ JASC-PAL 152 208 160 18 2 31 0 24 96 -71 113 111 -107 220 217 -167 235 232 +32 128 120 +56 192 168 +128 224 200 62 62 62 -176 144 32 +176 160 104 245 243 220 -237 237 137 +224 220 175 255 255 255 0 0 0 -233 217 173 -248 248 208 +224 220 175 +247 247 228 232 232 248 230 223 160 diff --git a/graphics/pokemon/sandshrew/alolan/overworld.png b/graphics/pokemon/sandshrew/alolan/overworld.png index 8b6c58a6699a2bf44cd7f14b43137f4cf050c129..1ca8f0e17d3325ef473897edcb6ce9c3f67668fd 100644 GIT binary patch delta 473 zcmV;~0Ve+81C|7k7#0Wv0001UMu)cm0004VQb$4nuFf3kks&jGph-kQR9J=WmfLOv zAq+&|P-^NygXyfyIPl`yvTSwPR9VU%cMphya2^b{)nXQ`pK;c$eS;a7kRdHDeRu|9&hJa= zIt=-oy^kSfng%nD1jMtH$>bSGxO`{X|59fh0b>lE6fZ%4$XULUsFLM~jDVEmclZ;B z)k=_YjbS>md-eWqLoR!t7xQ&Wnmhb$@DA6QNte7g3fU!u9J9qd<{ZrC5#=0>mD3GQ zAmSn#O`i+oTolYuz%e862Z#P8d~#>Tu}+#BT;h=t6ni2t`FURmgEx~Tfe9;bMy^V#9Xlm P00000NkvXXu0mjfea+U* delta 420 zcmV;V0bBl-1mOda7zqRe0002CwraMKE;E04NklfG)b| zqKp3%y(Ipn!+e2L%;Od(8I6+`+xxwY2hIekam<^ni8u6w%1dZ55)sC{k2C-$f<%7- zydhO6a`z4Qb_?#K#S=l)2iEq1;q}r>5ZZR!W?EA2EP7~&hF3IMmb{xKuy6ug^+yaDEC3FS`4 zz*^4gjdnT=tu$7GH^AUhsMJ}M!P;|_KG(0_CR*pNHEHDCoNh9eKO?;-MD5sIeD2Yd=pVi%m~V3_OgkC7 O0000{AVrPj1&DVh+pX){w%Qg!{3dADdA?ES_^1Vj6)S63GHvyOI#3G z{IOCC$R&rHa~k!3=$0V5(YPR8<3+ayTVI1DNRiw}cpxCI_jI-q_ExJrC~gDV1yW4flmn=EI=pus7p zKPyWews`#JNxTCF-@`>Q+yZwl=UtOX&S-J$kzGK_4w>>1FK4AYHXja4VO1&0J+k=G zBsjdlndPn4r0fuj^D0|~!&0|$jk|IfyujICX?3egdW-M%YpW^YLknPV7k7t6+oU=t zu8RS)l_F1nSc4y`G3ChIZ=kciichAMDa9eEk6A5W4iL4YNA7n6a01f>m`c!$l?(u;SY~%?2{Bv z8!a20J4E$cWQv zM^!$>;5^Mq!Z-Kr0XT-JfOX>*EE9;h{u4kgGK=~II0COhKMhq zecz3GkiWby+8cF%^XPpn;x$6ZVVqUPKp&?UBE>*x{CyWRhsZa0o+RL1{1A#Xe9O*j z9BdfW0*ru8eIXA!AuS;qv7zqRe0002CwraMKEt8 zUWP_UAr!_;x(3of+Fe2}J+y_M#poD3iGt$I5|M%a0T%y<fLYTbBF-Jq2@62;O?| z+W(-lsNFZanWfi4AA#kwJM+Gi{R!~D{-z!p8>=1HVqJurEe%t0yJbAvgid!|&9MIE-%htKZp5Wraa~3nr7t96GVdG*1GaVNdc!-)7wq$EBT<6)B6dndwz; z&1MKz-NilBFlo9gb!~8~Tal%2wT^4WaVZ1rc~W-v?5_IS@hMBXB{z2EPCPtmfEgvF z+OivTpyXD2a{t@L7FZ4N;N+2f#_!*TWgzKz^N*7c-5IPIT-)x3SBuA1Cxf4M$6Q(pUi$vX+db^rU1`ZZc{!nED1 zDj)k$U^`A2)^2(oZZVWYA;N$2ctX;-t|!}T*ezMZPf{ZstDB!ytDW*NJa^HG%Haf? zc7<2NH)7Wl*g(fMrBu^u7%z>hXgv6h`39b^RG@m;hizrthzsgXTXCz&u-_Qs@sn|V z!jRcmG)KrIUySf^9rd~io1}U+^1T`oOM`Rl{ATtb}6Xa6@gA%gd6OPIk zn0j^@tyuus#sMXUzc)ZMmY*V*IM9j_aLJ4Tmt4=dz$1)?CT`34f~1ao+ZZ6A9%PsT2SJ002ovPDHLkV1g5CZ;b!| diff --git a/graphics/pokemon/scovillain/overworld.png b/graphics/pokemon/scovillain/overworld.png index a0dcf404339449e710fe9b0caef6d2b0ff5c94d1..ed7dfcaedc9b6ae55f1af184e552e0bc06e7ba88 100644 GIT binary patch delta 1280 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 AP5=M^ diff --git a/graphics/pokemon/shaymin/sky/overworld.png b/graphics/pokemon/shaymin/sky/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef9f6a09d14a151ae1d2c0f2ee57999f2b9eafa GIT binary patch literal 829 zcmV-D1H$}?P)Px#Fi=cXMVQc_SXgkd;9z*DFz~O-VM{o{z$hD0Q~&wbx#I?X}lld+ndGTFsxs%!BFp zg@wTX!u|cP6F34j?p9Mm)c;=@g!W_OA_2S#Oo3NkLMWx&cu#{pERY`H7C;?3AFvvASK4O? zymQ7=0niGFT7aEjx#>X9s;}zfkYM1menKf?KxBRM7V5l+O`DXgR8?r_huZlp5I+Jr z4?p3EDZrKA98@4hkBHKLvq0un12jRE=)Hhh!O4RwkaI-qeH=NC`gx0pM6@^9hhv~F z;oSkdLiU&wbb%K>3X}-7V}9P|3>R+bll6&`%RB;&lY_(>Jz9dK3pA%6`7D7J1y~>i zOWreY%Ol~7)dA(?;B<%+KxzqaUvo@^~#uXaDUGbUYv>pd*sAQNV>8 zaNl>W&z#Rkr_JQ;Lf!{ z)+V6SA&>;xoA~5LfmA@o`E*}B_9aJX;ZyPoP#(N3EIvGfNuQfTx#6($Yuq7Ee_nHm zPB>Wu;=)7l) z%E4X&S~xyj&XA!Elvi9sl#*pHI@^f(aTNC|Tj{z0?uB{l*AQmKp# zivsBct^_{Dr+XG(bDS#q7SwFL41X8!#Gm8WPoPI7|A+koYeX&F$>_Qv00000NkvXX Hu0mjfU$b^E literal 0 HcmV?d00001 diff --git a/graphics/pokemon/shaymin/sky/overworld_normal.pal b/graphics/pokemon/shaymin/sky/overworld_normal.pal new file mode 100644 index 0000000000..81840ca696 --- /dev/null +++ b/graphics/pokemon/shaymin/sky/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +88 88 112 +176 224 96 +120 168 48 +240 192 0 +240 128 168 +128 128 152 +184 56 56 +248 40 48 +48 152 72 +232 232 248 +168 168 208 +64 64 64 +104 128 0 +40 88 56 +0 0 0 diff --git a/graphics/pokemon/shaymin/sky/overworld_shiny.pal b/graphics/pokemon/shaymin/sky/overworld_shiny.pal new file mode 100644 index 0000000000..391cbc1791 --- /dev/null +++ b/graphics/pokemon/shaymin/sky/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +88 88 112 +136 208 192 +80 168 152 +240 192 0 +240 128 168 +128 128 152 +184 56 56 +248 40 48 +48 152 72 +232 232 248 +168 168 208 +64 64 64 +104 128 0 +56 104 96 +0 0 0 diff --git a/graphics/pokemon/sliggoo/hisuian/overworld.png b/graphics/pokemon/sliggoo/hisuian/overworld.png index 511b750d83cc9b553cce2238c32b5b4a48a0d82e..a195d8204726fec4009b36e5b94f0c5e18cb0e7f 100644 GIT binary patch delta 608 zcmV-m0-ycp1&jrd7#0Wv0001UMu)cm0004VQb$4nuFf3kks%|0V4RRZY+wKY00000 z000000000000YQ^g#Z8o3Q0skR9J=WmI050APj|-Qb7Ly55BgdyG-bdy5x3=HFL)A zt-Ml{P16%kJn_Vr1oQjFIlkQ=VaRU=r`!g}sW$}Ta^D2)>pZ_3A1ENPgCXB!phH9c z9R)C_bd~c;cqBl7TnO*yE4(H5THtds$cg@j6N^8R82udZi89GDNi5%&_(YU)&S~tx z<&>F7p71;z-sh`9!EOOAS9{qkUg45f4sB6CKjNwofqg~=K;GgKXPshO-Tf9JuIp>d zKX?lvz8k#4S*O=|K_PArc&(DX*8Xb-^P2^D%MWuKU@?P#%g_Me`x?K(?-xLIH&}Zr z%#&G^bL|!2bI#Q@h`0{0)HXwP=^8{_4X!aRaLCyvrVbZ5;-*=oO@+BEgPj=hWZUF$ zt9Q8>T=empHBNJhdDfk>NPg-H5EsF08{Htk&t;R)XN-A{8V3pDl0L-9)?kh?T;P&< zw$yUf%MUnzQPD?)o8llr-2BN3DaAwwhnR=epUqD=&DCN_IdD_Nqr~OvFV0*vtV?e{ z$2>H1tI7A_5jTlAWb0A40-vt~P+>V}XaI0)uJ!jcR|(17Y(?4-bb`wO5>)K4>w^Kz z;}+-nYLLTLq)841c)U3z`ODhzhxvN<74L6)#LXc;yAq$@HSmc70=W{v={N2CVa1$& u;q!d5jlz{6POs>thkODU^3SCBZ}9`wEFS6bknREi00004jvcX{!4Wf0agvy{hdst(L-R0P+)NXYv#vGsqVf z_Nq#bX>#_LYlM9i01J;)t~jXZoWiH#WEZZr>GCQzFRL(@_{akfn)1JrMSy>3n-agi z%z}bj$ph5}>W9R#N-YYFj9Wj<$=m5-36SC2=T7w{Rheuxed|NV38p0$0U8~x4xu@} zp+NdU58J#x(J-~WW!2(a(oa-t1qU@8owU+Zsb$ptno zI0?{r7|qtn@O(bxf^XC{4WfUIkd+%qb)TJkj%`iDg2ktT-sc%Z*A{7m4Z6nItdV%aN3ANUOQQiBcGYEcoVeW}4|&tX{(tQsf3{~z6{RZ;00000NkvXXu0mjf3v5iZ diff --git a/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal b/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal index 66b17f5ba2..875167548a 100644 --- a/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal +++ b/graphics/pokemon/sliggoo/hisuian/overworld_normal.pal @@ -10,8 +10,8 @@ JASC-PAL 189 148 205 222 197 255 139 82 139 -0 0 0 -0 0 0 +96 156 144 +64 108 96 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal b/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal index d9dcb3cab2..3d0290753a 100644 --- a/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal +++ b/graphics/pokemon/sliggoo/hisuian/overworld_shiny.pal @@ -10,8 +10,8 @@ JASC-PAL 189 148 205 222 197 255 139 82 139 -0 0 0 -0 0 0 +170 171 96 +134 124 71 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/slowbro/galarian/overworld.png b/graphics/pokemon/slowbro/galarian/overworld.png index f62e2b3bdd8463de15f83630a7751395809e1641..2aa367992c28d4f8f56c3b4cedf7b0a7a46da46b 100644 GIT binary patch delta 1052 zcmV+%1mpXb2+IgAiBL{Q4GJ0x0000DNk~Le000310000W2m=5B0Lph()&Kwi0drDE zLIAGL9O;oEKYz(dL_t(&f$f;>mYymMg-4=5u#WeCw`V8#i2?ea>5q0Tv)XCbJP7Wc z1ktarH{N*TjW^zSn$Aicr>JoeWFNmLHkZ5!oqdlg_&vCtbY`_rO7q|J3 zG6;DzX%HlS&i5r~jE$S@@W32e8k-#QMvaQZ4ktGq;eRXxIy^5SMG`tiR_92t++f{; z7DsmX5_PtKHV-lG`l6Mi9+xFxF8;V!^QXg+V9gMZ6$hFe`Q0--+6J_F45z>lKj+#c zqHm;VE9~)H;G%D2(}6ZeZ|xb5b`Q5XG932=KQfG_Y4SXSrdM{E|HmOPjI9!A^GK7| z6gxkWm4CqwZwMsfnYsqhIysLeBBr+n^tdFLMvmh!jN@uGVVj4^doTAV|5%r|_?F?g z=_?IzoVdX?coE!f4Xy@cgTYr6c)FEHkLwtyTE%4izyqtSK^mtkzhP9k2-N9OV)~!^bAl-m z-+#Eh3qqg_V`){K*oyPU##xQLbDS}c3ZoTK-hPLxKvDP$0ez%3eZ|hn@nz@JG(z+N z(Q_Mj|Y`DjD5jc9$0kY($A^w{OnV;Ta;^PB$2^+Bhoz067L3-5gp!t{-M z6l$-4>^>jw&k@~Ea(RUHq&QDrhCkPFpZ)$ZjBEMVV6Ls*|K$4TzRCX8UpC+PApQf0 WVKp8Oj6T2s0000%cZ7lOYthGvs)6qn%1X26p0lPR1_6KAoQUxLJ=7l zND_U>i270lSx^up^iEWkZ?nSQz-&>@S>EObZr!%)p67167jEU(z~{s5`Q6>~{Gaz5 zz)YG+GikbsW&iH1iJWHrT+B22e-~#@#I#z-+5y6BcH?_sXd>MrPFthKq&>p2OT$by zqg(9UCNQ!zL~PhiSqhXs>r9X|Ku!@C$YQaYYHsp-01S+KKyu~7!+uU_q0Xj#=vq^o z%>dQ;9=-vLEDaIi_jt-(s+rL`CxotoBb$ND_ov)u#>i5D3e@5{C4kO?e?xqil&VDo zsI%B5fBDFl+qFi<0nEQ#9uG0FCH-7)-SRlZ=x?o9QbFtkr;%|0!EK_b+Ja1rbY}5d z$kZwbdo%{HzPak#KtjUE@-p>ZdYx1^NoA5b$cE6q5ZdJ#aG5kl$;Bkc)g4wW1@JPi zNwQvfu5l!1x0I0=x`msie;=ZJ9zuTA?owF_km>~J9I>R|Z;~t_Y0oEYD05RDt@v^Y6|pPR>? zY(=JR57QCGM=cW$8~=G%za@}%DG$gf07*}Np0oXAZ*PmY3-6NPf3jzy`+d|=(ZrdK zCv@L%2!cgJxO7cZU0^_Ti5w8kd+Ff?ROPw);j!F+Y;Wbc#l@mg03uad);BbmYK%Cq zqsL{uYqscHJJv?U0K&Qrbss{G(cjdI0bJXU##6<}apzFxaJaXdoFCg58FfCEy|W^= zaXe2no`c#EpeX2?f6B?l3!~5GK+d}Y3lNXApC|;z1J!G!!nvUXk~yC;&E{=mj?=)D zrJak2jCvpt4d(r9S%Ed4h@deNg7u>3vDKkMJZ8-efs)9gPjs{!mrXqQu@F1btpr$i zwm!b{N^x7-DMUKlCY`1e>l@-0zRw!Iab60K91rKo0q=T$e@;>Gp{hkLocQjwSm8b0 zqFSi03Sab8*;_L%66xYv<>NXTCFvOdvCw>rlUAnp8y!myo_+UL3fRTZxA7&h=b7TG zqN1ZORRNMa2b-OT6bG%%&cGdUj!c+6d=SF??ZfHw@zIux@ZjLy3n|&XkT9*cDaD^| z?li4_sM%}nJvFIgYR^p_-{jMtVT|(CBTjB!3wzC-H{migx&0tWtr^auME VhQKn1caH!7002ovPDHLkV1kyC?$!VR diff --git a/graphics/pokemon/thundurus/therian/overworld.png b/graphics/pokemon/thundurus/therian/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b76b77a177402565442500401b10ecf5b64444 GIT binary patch literal 1976 zcmV;p2S@mcP)Px#Fi=cXMVQc_O-*C%?e;7yEXKyt7A6jnVacS7_Y+cAV7b~(oV07e-d~4lsF*PL z;6MNX0I7+SEdT%qHc3Q5RCt{2T8nbzC=4{n0uH?Q|DStm2|p&;Ghpvks;KCQv}x0(O`A4t+O%oYrcIkRZQ8VH)22|bmxipv|u>m!IR&EIAqSTQ|-M=%aY0i1-PW0Vwm7%=D#i+V&n)x zbQGxyu#OO3;3{AzmRT=!xF7C{=;f43KH}&2Hk6e>-@1chfS_LVF7w|O4&@+;A!`Kv z>Q~qZS%oivOAuUV0`a=ahL@{N0IZ|rOqBS%;9h{^a}m*bu&gd`TgBAgFi50DFQWu5_}#^fp73mG_S}T)!Sq9dSsGF>5k7E;oC2Oh)!9kl#-4BQZxPw zM-Ab6WWKu4ciRYXF_%7xHZZ0?ICSP0f6`(6{Up?oT+PKce7b0LQsV^$j7Ek0SgK z-j@PWt&$cGaoB<ztZ!!iU*p$IE)C)*%&>_Gkd!}sIDnj6P7h1S)@Ew0~ zpb5tMRWVs=_P%6!>APBl8(mO04e;OKu8tG8cs}BXUn0v8#-&8dDck?I&BWOiyb}~< zI0L8(w#&)3W$YT|kjUW;4P?OuZukKO(FAoJPABMJQK;fCovN&ewstVW$J+hBz-!>{ zn;-(X-ynq|eoGz7rDl}|x7mbom2N&E$jXpQNE$#^`sP+lmbV-31Og>i7h1?~@B?oO zHnrC#s27W$vK@c-M zVFE!0gUhuOJG!LDjiGjW|5wh~Oge~xmwHZcU*U>3$GQ}>CP+5M_^Yu6@V*OL4+MPq z2CvSwx3JFth+j@pMkD1d$wsbp9WmH%%pk~MaB0`Drvpd;efb+{n=J(b;V8iU@xQ{) z6zWn?n;>c5SkS|~PxA6o(`s3`?}D`l{wutv3GSixDJ{um>7n=;a31d|AA27VFZn`{ zylL1IMe$hEcIAX-$hf)WZRl(P2Yjt1tnT|R1-S-L2VV_g65o#iwz}Zn1OEly*95hD zXr4*?(haO93!Kb4wy$})Ut0-eJNO#L4t%Ob%v&MW6kyBi9y{R4^wT!Xoln+l6SQ`b zc$4gxQnqazQ(|s+!LtXZ6ff{}eB7~%j{wR5gAM2w%gJW_KL~jD63;_$F2ZyN4f_bh zYa1J+aY^yS3{zbgf}4H<_j(@gQ}Aelh@eby8;n;eqPwuIr;&RPlnT67c!{FlvJ2Qz z2rYmdBOD1)PcmIkF;51IeVe5yn5@zeM3w&GW>eBOV@ag<0!Plj~U&6Hi#{L0EtvV1#$Lv1<0000< KMNUMnLSTYQ5~U;n literal 0 HcmV?d00001 diff --git a/graphics/pokemon/thundurus/therian/overworld_normal.pal b/graphics/pokemon/thundurus/therian/overworld_normal.pal new file mode 100644 index 0000000000..30e45bed09 --- /dev/null +++ b/graphics/pokemon/thundurus/therian/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +77 77 99 +237 237 246 +44 43 44 +198 198 210 +22 38 14 +145 97 201 +164 140 247 +19 82 87 +96 185 218 +78 156 180 +107 192 222 +95 135 105 +168 152 48 +248 224 64 +0 0 0 diff --git a/graphics/pokemon/thundurus/therian/overworld_shiny.pal b/graphics/pokemon/thundurus/therian/overworld_shiny.pal new file mode 100644 index 0000000000..15920a815d --- /dev/null +++ b/graphics/pokemon/thundurus/therian/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +77 77 99 +237 237 246 +44 43 44 +198 198 210 +22 38 14 +144 32 176 +164 140 247 +24 40 72 +128 152 200 +72 96 136 +17 79 81 +128 152 200 +148 144 48 +248 200 112 +0 0 0 diff --git a/graphics/pokemon/tinkatink/overworld.png b/graphics/pokemon/tinkatink/overworld.png index 85e9bf94ee64e96469f20bed81bc5b78a68a3704..bc045052330a295a17a8dea454da6e3de0c2ae85 100644 GIT binary patch delta 643 zcmV-}0(||)1i=L%iBL{Q4GJ0x0000DNk~Le000310000W2m=5B0Lph(){!Age*!;A zL_t(&f$f;fa>F1DMZp$wf(!ruxs@PJoLY}ItU801JwnpGsIkW(%$PA_#*7&=X3Ur| zW5$da$M|T4;r@dK;+jw+C`f;0|29#U;o_}mWllLj_^(n6 zYdJSnpv6c13lVXIKkFmf3#xE#u-#k6eG^k0{x<`17V6*7IPdYJK4qB(e`uVa5wu|Y zzVn)h9c&(-_rv~N1-|k8^>s-Ayd$<-mM3(0tIr8{!Q3;?86-{(VnUL)@2EU$Ph2SR z+E5e)zVVU;1NJ>7Y$5e84v!tBB$<2S3TA`p0pH6UUM1AkB%4CemZ|NaKD!feh_go#=qC7 d;TZIP;~U-*8a}8f%5MMw002ovPDHLkV1g^|D@XtU delta 520 zcmV+j0{8vF1;+#-iBL{Q4GJ0x0000DNk~Le0002M0000W2m=5B0CPr%w~--Be*wiw zL_t(oh3%KYj>0euMC;->kkb7B=dP1d)T$GkC5M$(nIq5GGfo@9Gz|?64Gj$q4GsMl z5%uxj4!!efzS;d9t`)c0?qKrn`83bwe2Go<9)>HamDcIQ>2D6gZsJ->eQ> zH6GUjvJb%FoeQMMK@A3uxW?rae~XO#HrImr7D5Nt?rN~i_=a!xqWN`;Yk_X3J^lk8 z%@LpTuLD$j9X#GEzc&q9yf^pvU!!(*s(TMIUr{ zS2>*C`ziUZ22VUapO*rbhe+Kr+@H%QrXXr>S)_5-9yp@_yF-BnPkc=vf55VYAXRAo z>TnIH7yO2afx(FnT&@L7uk~m_Mg|X@*Y)}cCE5)_f2+f@niAonQUeUuk2ekiobv;N z=lmI1Nc0l&rwOvf)0(;LFr}mm0s(Sf)nes>PN?K(-WPB+$a{R|(g|A3lvpA>{)(BS zPQm`4nxLL?{h@H}kycGuUVlt9POxm4w+%ysWhvVUaLz4@lmspB*rPFif9YDs_X=p0 zOz-^IAlv!(2KfDZ_n_AI!M%LK;Mzk5-2XeBe`r1$0p$ezJN*Dl+7y@k+>3Jn0000< KMNUMnLSTZLlk{Ey diff --git a/graphics/pokemon/tinkaton/overworld.png b/graphics/pokemon/tinkaton/overworld.png index d34001d5cb2a8fb7e3eb7233cd95221bdcabf059..702afdab9dde80da17c64aa28814a6e310c4eeb6 100644 GIT binary patch delta 1551 zcmV+q2JrdG3C0W|iBL{Q4GJ0x0000DNk~Le000310000W2m=5B0Lph(){!Age+9%z zL_t(&f#sR&lB6IEg-v2JB96ZQ+iotP+@0E~{k2q2SB;-Q&LINQ%ksYzMEqq7#N`LK z0heF)^mnmNYaxEth=<|52qXZ+cLxAo9GKt)aQ)21bl_AW!>@-9`hO8f;I_@ZIso9f zOdOaP^Z;DHIu=a)c~Qvpll&R=fBzqoDy~gPa(!ISq3CER6#*e_j-#Q04?Dz{&jV8ZZ~gLCfI1 zP6FgU9~j>?Hb^pK6Qy-SEN|m1#&jjKlu$m=+Btgbp zLV#U7LMyEU!bb*iG~6hnq_{lmu{!@#^1eTFg|;Z@#2C4>RXd;pk%gH+{uByIJdn1EXpy;!wSnkqX7sCqP^QWUQsKD?fK*p2)#B+h%aWEJ{l>oK|AoaN^ zB;u%DEZkY00%2@W(5S-V)B#-&r44ofa^Cf4pipM|+X2Z7<3O7)c`nd7pGrPOf^mY| zy^<#p8uhjf90-1Be^Bt=ves?pz}*Ivyz5V`(3e5R#E6`1iY!I+1m+5b1C9BkPxP|` zVnS^|@Mz0T1sO1gSl{Dc+UzcX;7XrBK3>6yR{b=@}!NCINQg zXTwGRt^yCDe?$JX$Nh0&&b8g-K$KtT-)9Da#&T=ilTXW#H~KS$yE?!T9_NvV5R3A& z;g7)YgUfeq0PjU+JQ-laXTwXa0V9Jn7HiV)9HBap>1%nTzf#Dn>2V!bXt_5B8cqyU z;3)#n<09$nNuenxZB@fVibdkgE4Kzc95|LEdb)cvf1t?kmN)tUF8O#$Ls2HsVvR%=!o(?#hEvL^H_4u3b~Ngifv*cs~?R|s2h@10@Q{ukhl-kv2yH)YVVe{JMJ(X0E%ljugG~~5H zjc($A@zQ}?po}oadkO<|muCFJlE)WpQg#vb4d7Aib3LYto_F zrF(Opg&ch6$UX~s!0$4JZ~R9;{{G|gD*=B~{s2W#U`yMe&#V9d002ovPDHLkV1mWP B{H6c^ delta 1167 zcmV;A1aSMt49N*0iBL{Q4GJ0x0000DNk~Le0002M0000W2m=5B0CPr%w~--Be*{NK zL_t(oh2@y*lB_BWg-y~jg3kE| zpEDuipLClTBml%Y0l{Yp zkAT9ug5Syql$F_dZ2}PcUzh-EdCZp$8e=Cx1Y|n(^{X3&?em3w0`2Aig5?J!%}TJY zpVFf01HNn!V&qBey9EfmNr@6dPhYefuMpt6_5rk;0|-fnX8-IF#pCBwe^&XU_xTEg z5%jAA5Y)P(tHB^OsL>;Um^?uB$AfZ>giKKVNVD$pT?X+n*c2F$ERe5rAS7W#i#LJj z9w0^HK@p`yq}FqH{-@R*zRMu8F*C@YssZrELFDV=k1vu8Z}B=(ME3x*KmJ&$+fkt~ zq0zg1g~7OM#M+?r00r#pe`YY!22ZpELhk{pLGi~0miH2^6#=gFKHqJSJBl^6*(`wV zK}dbw91`)YAqP+2F2U{t?xdqGK?!s}l`)tAO5Ndm42BS|*h~MW%crYfCUn+qa|rh6 z0&-e(WZt5T;2r~N-QnvQEFFpt2e{vZlGL)~e^>bQfAP5n zYXaH8`Bty5=Pc0;pv&9%_W&z{QLbhGd5dZFhVM2=G69jSQvS(2$F2Gw=y?(f;aS`Y z;L$sPaE+IXBwQKxfAos)GDt}c9z=)yX^->}jCDxyA;|VC|7irs2jDk79@E9SxO(fq zH28gRe7696mW=cZz|v>wr8j^FNXO5Sa}rZZwo-+^x8C}fvo0ky_#*~?j+3PAQ|3cm z#GDRz;>tE*344>RqK0w;Ee+0mY=h@YzvsmQpi1T#K zQx1OXIZB-!a**}QD^enP<5I3$7*v#PG=y2-+k4l%Z z>99xIpr=JWi(ZJB_1Nej{v#gLHwcK`PRr3-0onTGyyhe>x=Q5=a98fE zPh9yz>;G6}6XMR;5`qC7cKy8o@+Lx_K>E4`>f4(8W$hwc#Oe)R*3FMLDs(O3>w0lv zDgUMO>D=f#8W)$U?;BnA&sB@Lckfm{=LrVybF8-`@Zj|`YI9+xYbXHUH1Px9dj=DI hePZx0hVRbN{{v;3NE2eTrNaOK002ovPDHLkV1lazdb-rvkhS9x*zUl!gM-2eNcIU61&rM+ikbqcH3>Y z-S!&>Xy5Sv-C#yD6pr|}wxE5(KQXh0zmb41L@czuv3SI5jCPZn5*Qi^NBol@4ZhUv z)x{(Jit(>%hE!N6bap8y`VcH3RnL1E(fEl_#IY9$n&G#lz z`us@1J74FfZ}zJsam0@(Re@}-cA%TC-xHLF0s%AV#2Sw{Z|_=;W{{H%DsP#YSNg;I z%hC}a3uN4nm*R6&+nMVu3LNo?)GrJ4GcKHx_u_A5Yyyumzb_u~4+NgDfAmFmp#pjf zg2EA>YJb2C%A^3Bv%+3yEdvIhVvMH1>BU8i0z;r6L(mdn^L8%36#W*Tytf4oc-&Gl z1;&kP*zr|@3nAwKK<{z_2E11ibiueTbC&;MmYX ze25JAOCi~k)V@hBOWQUv|D55;%7*Js~LEldff&=7di%z*n4R{sENe*FEp7lD9 z3HIF*NDeO4Af8!h0K7swmgq!%WCxe7+fabZiw-dgi_cu#ed0k*ewe>RR=>~Ph)4mP3YbqAHSvDb zQ2VXmXj;npUOw1}k?tLr{W0}s2jEQtws8lP;;jxSWmP(0e|P65Rvfs7ine-?rtcIA znLO!>F$3sZ1Zgw_P`)(-=ssAA7#BahY7o~_5udD?00000 LNkvXXu0mjf$6v1~ delta 717 zcmV;;0y6#O2Z{zEiBL{Q4GJ0x0000DNk~Le0002M0000W2m=5B0CPr%w~--Be*%a} zL_t(oh3%Konw%gEg^iOI1lE23w`~$|$E_!!?M~Yp^Uddl=Lmm7KxbL*xZ{pH?zrPs zK@wll|98+T5fIMwe-U8~Uy;B=;w$=OkwXL%1HzeZeCh}YXZoMlQ1a#u$oR>L-s4-h zxP&u(mH@4~g3v%K9e_B&iT(+Ye-@`tJ`!;B0MLT_3i5L8GroVuWw1PEvP($|Mpa&`($ z^qg}DxIA?z3t&n*NlIPIndW5t;nxcsTzD0&Ij7U$(5-g>l z6izzKaFMzNfWyEdlGX5%fOH1g1P-5o+X|3PLstfQ5BIS*IT8V)POiEm+jr;zi1-%@ zYp5S;dgUD#0Gm!>>2N0(Zf2Iyzfq&UYA!1~4dom+>*v&tYGt z8Qib^9e4Sj4h?W$Bj|?gJ}Q<-eoc6MePx#Fi=cXMVQc_QBhLb+T|7{4%o{=jC@6GHG<#YSurfC`qI)*f=Nv z0000005ng|T>tea%e5+*?KW0>4xHuLkdp z!mgznT3OH)Vo1&p6`*I&V+BZn!y~ngHA<&C8 z2{RJ03m*vl)9yXB|GC_e2tEQo;o$-Vc*F!i`fB1Xsb2w;P;N-*5B$^aJ+=R3zx5HA z*DtneRJi=ueoEAP4P8nb5O#UJ(guT1s<)0j@ti{z-e+3_{0;vd*k$j z*R~H7NT$HXpU4`?M1|&tPZ0(7?O}^TX%9TOy}1ys{Z9nS&WD4*ylx9ndRM?JfUK*6 zwR>hx$-WtXq-%#5IPft6*0r|(1pkS)z^h)53V;OywLg6#kZ8Z;A~3J|Gg`Rt{PItj z1ziGUSqou1jX2r2w8%td4ff&_KA-?A2iX*0<6kL6;1!pH0yF`WyY^vM0;v=mq*#0e z=CuV(_^O4xplw5UU1ioU4PWyVmKmnlGtlYL3QVZNP32na%nB2AB_CFEG%D+ZVTLm}>tVMIB91EOR&aJRJCjhAP1Kw00J+1J+l3tgLaJjYTtZ*A&?OP)uLOokHA_> zc|5dn(L4WoTk5+J$Phqvuceu~V^@OwpYZ{hI%+7|_)jhH5T=?ZeIl&N#)u zzediVvoC=O5YDQ;jxKeR zKm^B--wzc4lTXztnv#a1o>VUZY>nFn=mQ^XV0z*dBT(Zu`jv{vIgV+v={IW+dz(l8 zZ}UbVKl!g(0MZ=&Kq~-kqdVRL36GKW%wGiB_-}*U zbAb|5;7K6aI286m7ZBPNh{s_95T-BtqTrpB9b7N?b}791?(x{>%-p>@Qh;3YWk( z0O_w?fZ)poq#~|c>35t%(}GC|7MXx1dz@{XPG`Jqq6FNx@lS8SYIFps1?LS89=nCZ zVT4mjhq1^qAn=DNp!#fS6J&w>&3E1u8_!(-57e8vROY&WG}@M2d( z>ug@Mdx8$6Sxdb5>jVwFKgWpi&#Mk_^oA#$tRsH#9yZ6~=e4~&aKYnMgFYH`fxZ{R zw#{)%5q_WGj(zpuHS|FCh5)&JbbZB#J{Z2Nc;^LeJA-?-?%VP!e>wD8%Taf+3gqpi zf5&&e;TUcKS8&e3w;68Q*WP~1|LyXVSihBq!{U$9hy7ynzmqZSyX`-vF;1Jl_jaxT O0000D=b|Nj6002nz+ zIbwU&#dA4}tlr+N?(YAj5ExQHF^Catg#Z8p;7LS5R9J=Wm+5xnAPj{gcCcH&|J%-$ zupK~3dS*G(KUK3d{$#jU0@6MnKk*a)DCoNd{B6+Sz%)be@wW$sOBa!CfYx7B#_;-| z1Cx@2gHj5dII?7a(9QqUz&|snhG0z;Lap1j)fxhNu&7+Pse(>}FBP8r4+PFk&pl7@T z*WSh}F>8a&w?K8P6gGoD6A@nNn+!Pb@Sy1y@}6?eT;qa&cmB9IbZ+2I8-Q*K-fhnF zFE99M(BK?cUxmvHeR_h6I~MQ##BmY#m3l9cTKK}9(;ZG+*NE!^19%J08`B3DZjK*I z9*(>-^49QetmhvD zMkNqeMy~aDi4|XDEk%NXVobr@5z1%qQem)Sec?SPB{1XK&08&M_FQT`_0?+bp@D00 zrwDYPyIdepwczB`u!M`|Xn?Hkg!hJitheTW+=dLp0ERrj=*-E#;^#CeVy8CNXSpo0 zy7z8i=4e2=f=jGAP%rtCp;}Nx;2lN*-t#jeHrF2GD+98U;UHQD(h#PBF+m%sbNnuU zDwNIo%4RnZFaF8^Hk=+gws!`OSz$STlTQlUoxD!d@y$mp0$Yq+0DZ=A0ycqQ)8LVR z3r3aB;!(0P@C6?wq61hX*>=$SCas;1Sd{bW5s$+(aLC~v#fPGNQ_X#8R_mC=G5h3) z`kol($x)6GoNN3av>HbAm(C{#EbJP>?!bAKjcOc^#(%9>{)f#<;EOkZqyLonA|dwr zU&bbbwrnfR%&t1i#(GhJ$H`5D)9^1PrNnpeFQbq9)!_M=`V$hr0N?mF1rRp5#{d8T M07*qoM6N<$f;2QB_5c6? delta 1320 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 KMNUMnLSTY+I3Vo+ delta 557 zcmV+|0@D4W1>Xda7zqRe0002CwraMKE-8Nj|4BqaRCt{2)G?3SAQT61VCW3QZZZaf zb#v_KcJPaGE6D68wYt4kBzLYV^=lV;ml&Lobgh(^=_joJBM)qZ9`&e4J?dYJtp&Yh z!Z^C+yZJi_npFR7k=BK$+`ldvgo^|+LrNlw=S8OX1|vPm5lJ`*^Yl_ z16;J#ZpS-XGC8oCEt3W_qpE*JNV3H1)TCX6zr5gW!Qo82_4eHF!k?<{6%jZml1(pD zW33l`&$KQWVGA0xMJ0cI{=%qo!~UbEYB!njR&BaYiPNdhjcN^c(5J^QjJy5~Xw!Ib zC(G0b32D04i1jHzm}q@=WxVqaXu*H@`3(&Bjs18za4R#1;s%VFW;!!gE(Q*wV6{7d zAkNqDJ~egB9k-;UQb~i{*m%ZS?eukH^>Q?tIOpGoKKI|i2KHHl%*3{(*68pofhe~&-X@0mKNrvt_3GmZX+CWk~;Cld(oDogX@`YKyrYj{@3~gY!HnKufW3z00000NkvXXu0mjfkq8n~ diff --git a/graphics/pokemon/zygarde/10_percent/overworld.png b/graphics/pokemon/zygarde/10_percent/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..1b72c1eeef3c340990ea3e0f331a93372d4fded1 GIT binary patch literal 693 zcmV;m0!safP)Px#Fi=cXMRUcZ0000|VNf?gHViES6&e-Z{nd)uAQ)01DKRKRn;sP!75B>(^dGf6~2R9J=Wm)&~9AP9zwm}qcW?*DEF=BH05VAkwpd%{7R=B4nV zsLA7T+ikbqcH3?L!2m$LKFhBMxM&apw3p}k^#B(QkfTD35jZ?5`8)i20I`A1Q|WL( zP7rXcpK5-eUk@PS(3zVamk|nKln-@$di-ht7)LYo8NMg5oqGII0D$C$?(!|Z)R>(7 zE`PrO?v0Sc#GR%8^Ba%xm-AmQfOvSPaa$X_&ZEO)Oxemmg`BujGr!N@FCZs2LNVT^ z_&S?hu%Z7^aGWU7G-7#+v%{(o%>WjED&(u28-)k2*w9}$I`%XA@Rc{STyJbUr5C{9 zna}1-B6HI>450E|{x`nImk3D}_{!UPm#0~3^G%#z!$EzA!{U-STd;< z$l`Q35A3$a_b(iN##vw@ZZ%59SSL@e;zuq>yvoT~!@0vb{wl04l({TF<`@!v@|J6E zB0d)fWP#`e@Ht73%(zo@CL6 z`0&taeN~NQJ?t^A&r%lN9K82kVeDf#EJROL%d8CX;i1yie1V-;*)uQewhuSA@uRt^ b(!Xh6+jtr1i}|;z00000NkvXXu0mjf9U?x# literal 0 HcmV?d00001 diff --git a/graphics/pokemon/zygarde/10_percent/overworld_normal.pal b/graphics/pokemon/zygarde/10_percent/overworld_normal.pal new file mode 100644 index 0000000000..d084071aa5 --- /dev/null +++ b/graphics/pokemon/zygarde/10_percent/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +82 97 80 +55 65 54 +12 45 2 +21 26 21 +222 253 213 +138 217 32 +24 82 33 +41 49 40 +67 155 30 +21 26 21 +254 141 141 +41 49 40 +254 82 82 +0 0 0 diff --git a/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal b/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal new file mode 100644 index 0000000000..5ea188226b --- /dev/null +++ b/graphics/pokemon/zygarde/10_percent/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +29 29 29 +222 222 216 +162 162 152 +23 47 41 +29 29 29 +116 248 213 +68 216 176 +40 117 95 +29 29 29 +54 154 127 +0 0 0 +254 141 141 +136 136 136 +254 82 82 +0 0 0 diff --git a/graphics/pokemon/zygarde/complete/overworld.png b/graphics/pokemon/zygarde/complete/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7303c36e574d5dcd38e3db1c1b3ddcdecb2d7e GIT binary patch literal 1185 zcmV;S1YY}zP)Px#Fi=cXMRUcZE-ftx2nbnOQyCT(u-I5TIy(6H_;`>&dU|sZ4-Zh7*yuo5=&(SL z(D*4a79UH=F#rGrA4x<(R9J<*n2naJDh!2f0zs>DeE+w-I{^U|QD?2W&Z=$s0_+|6 z>kLD@KA(XI@Ae}7y1)LKXF?X%xcZ#a== zA`)Sew!%J-9SAWa;8MWfagB)N(mL!a$E>j>+Imp@z9ZJ_iA}d`odk@H?&{esuD|>}GphXNf%yTed`r8#T-p zygEgXcuet>68wr=2!{~vc6sUm7bcm$wFPv!11B9ILg4Nd*BQ#*YlgWwMsB$lYX}rh6Cy2;UU3zO96RJ! z1-|0CN_j7vz;lXkcuX*$Dx4~(ued3kzEjlqhDU+6LM4I66yI=)o@OXydo8qc`Hb5( z3xRR7eZ%7zk?iO&`7D7K1Hbeh4$YX`st# zTbPLc;i&Kv&+R2ePq|7Q@#i$)1ur>m)6F ze!{a3AU}E)*WAl4In6VGZIsO8I5OK-iO?k(xZ!x)xEp13na}eRUIv2n4WO*W(acPv z65A_un#RZxJ?m({<9gq?gF%>+sp}_>(1ScQM6@@y3}C6^_@k>HBDI0h9#P`8 z0qY<)XOsOXAe9YO>_K4sy~NvnI2p`*SHB3<5hQY)r14ty$ApEPC;673>>!(=%xi-s zmX7s#C-7W91{~@a12%`62G*cs%R<@);m^7JNGdZW>A9?qJ#g%DBX#P>fCi5l&Ia7s zfJh2ya!hg7RjebhGFZiy^ywBy*d~0}fCa?Zy?)DZG=QFTejm8sLWUL}*3kz)uGa#q zvN|@`7brvj9vf^+U@F6w9HYD(>IXaS)8)T**L4eNa}8M6vzeB`I(A>*5}3@i46b&j zq(*&YxTo%6NW)CG?0m%p_Ud1y8165#-wpW>6?i?UTeXlS00000NkvXXu0mjfaeX0T literal 0 HcmV?d00001 diff --git a/graphics/pokemon/zygarde/complete/overworld_normal.pal b/graphics/pokemon/zygarde/complete/overworld_normal.pal new file mode 100644 index 0000000000..c70f440e11 --- /dev/null +++ b/graphics/pokemon/zygarde/complete/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +46 45 45 +8 8 8 +89 89 83 +25 22 22 +176 216 88 +59 58 58 +248 248 248 +120 144 64 +122 122 115 +16 15 15 +80 152 216 +232 64 88 +232 176 64 +144 208 248 +41 49 22 diff --git a/graphics/pokemon/zygarde/complete/overworld_shiny.pal b/graphics/pokemon/zygarde/complete/overworld_shiny.pal new file mode 100644 index 0000000000..9f9a249ea7 --- /dev/null +++ b/graphics/pokemon/zygarde/complete/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +86 84 84 +8 8 8 +197 197 187 +61 61 61 +90 194 166 +135 134 134 +248 248 248 +69 139 120 +235 235 230 +135 134 134 +80 152 216 +232 64 88 +232 176 64 +144 208 248 +23 47 41 diff --git a/include/config/overworld.h b/include/config/overworld.h index b666426996..bd1c49ab42 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -43,7 +43,7 @@ // (You should not use 48x48 sprites/tables for compressed gfx) // 16x32, 32x32, 64x64 etc are fine // Follower Pokémon -#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! +#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! #define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations #define OW_FOLLOWERS_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index e97b1b5ffe..7855bf8d21 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -4413,6 +4413,60 @@ $(POKEMONGFXDIR)/tauros/paldean_combat_breed/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ursaluna/bloodmoon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/shaymin/sky/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/pom_pom/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/pau/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/oricorio/sensu/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/zygarde/10_percent/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/zygarde/complete/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/magearna/original_color/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/kyurem/white/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/kyurem/black/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/tornadus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + +$(POKEMONGFXDIR)/thundurus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + +$(POKEMONGFXDIR)/landorus/therian/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/small/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/large/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/pumpkaboo/super/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/small/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/large/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/gourgeist/super/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(MISCGFXDIR)/emotes.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index e43fa7c565..a1c1a20108 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -11044,10 +11044,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/shiny.gbapal.lz"); const u8 gMonIcon_ShayminSky[] = INCBIN_U8("graphics/pokemon/shaymin/sky/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_ShayminSky[] = INCBIN_COMP("graphics/pokemon/shaymin/sky/overworld.4bpp"); + const u32 gObjectEventPic_ShayminSky[] = INCBIN_COMP("graphics/pokemon/shaymin/sky/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_SHAYMIN @@ -14077,10 +14077,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/shiny.gbapal.lz"); const u8 gMonIcon_TornadusTherian[] = INCBIN_U8("graphics/pokemon/tornadus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_TornadusTherian[] = INCBIN_COMP("graphics/pokemon/tornadus/therian/overworld.4bpp"); + const u32 gObjectEventPic_TornadusTherian[] = INCBIN_COMP("graphics/pokemon/tornadus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_TORNADUS @@ -14108,10 +14108,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/shiny.gbapal.lz"); const u8 gMonIcon_ThundurusTherian[] = INCBIN_U8("graphics/pokemon/thundurus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_ThundurusTherian[] = INCBIN_COMP("graphics/pokemon/thundurus/therian/overworld.4bpp"); + const u32 gObjectEventPic_ThundurusTherian[] = INCBIN_COMP("graphics/pokemon/thundurus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_THUNDURUS @@ -14175,10 +14175,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/shiny.gbapal.lz"); const u8 gMonIcon_LandorusTherian[] = INCBIN_U8("graphics/pokemon/landorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_LandorusTherian[] = INCBIN_COMP("graphics/pokemon/landorus/therian/overworld.4bpp"); + const u32 gObjectEventPic_LandorusTherian[] = INCBIN_COMP("graphics/pokemon/landorus/therian/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_LANDORUS @@ -14238,10 +14238,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/shiny.gbapal.lz"); const u8 gMonIcon_KyuremWhite[] = INCBIN_U8("graphics/pokemon/kyurem/white/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KyuremWhite[] = INCBIN_COMP("graphics/pokemon/kyurem/white/overworld.4bpp"); + const u32 gObjectEventPic_KyuremWhite[] = INCBIN_COMP("graphics/pokemon/kyurem/white/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -14251,10 +14251,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/shiny.gbapal.lz"); const u8 gMonIcon_KyuremBlack[] = INCBIN_U8("graphics/pokemon/kyurem/black/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KyuremBlack[] = INCBIN_COMP("graphics/pokemon/kyurem/black/overworld.4bpp"); + const u32 gObjectEventPic_KyuremBlack[] = INCBIN_COMP("graphics/pokemon/kyurem/black/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FUSION_FORMS @@ -15812,9 +15812,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PumpkabooAverage[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooSmall[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/small/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooLarge[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/large/overworld.4bpp"); - // const u32 gObjectEventPic_PumpkabooSuper[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/super/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooSmall[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/small/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooLarge[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/large/overworld.4bpp"); + const u32 gObjectEventPic_PumpkabooSuper[] = INCBIN_COMP("graphics/pokemon/pumpkaboo/super/overworld.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS const u32 gMonPalette_Gourgeist[] = INCBIN_U32("graphics/pokemon/gourgeist/normal.gbapal.lz"); @@ -15843,9 +15843,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GourgeistAverage[] = INCBIN_COMP("graphics/pokemon/gourgeist/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistSmall[] = INCBIN_COMP("graphics/pokemon/gourgeist/small/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistLarge[] = INCBIN_COMP("graphics/pokemon/gourgeist/large/overworld.4bpp"); - // const u32 gObjectEventPic_GourgeistSuper[] = INCBIN_COMP("graphics/pokemon/gourgeist/super/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistSmall[] = INCBIN_COMP("graphics/pokemon/gourgeist/small/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistLarge[] = INCBIN_COMP("graphics/pokemon/gourgeist/large/overworld.4bpp"); + const u32 gObjectEventPic_GourgeistSuper[] = INCBIN_COMP("graphics/pokemon/gourgeist/super/overworld.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PUMPKABOO @@ -16005,10 +16005,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/shiny.gbapal.lz"); const u8 gMonIcon_Zygarde10[] = INCBIN_U8("graphics/pokemon/zygarde/10_percent/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_Zygarde10[] = INCBIN_COMP("graphics/pokemon/zygarde/10_percent/overworld.4bpp"); + const u32 gObjectEventPic_Zygarde10[] = INCBIN_COMP("graphics/pokemon/zygarde/10_percent/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16018,10 +16018,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/shiny.gbapal.lz"); const u8 gMonIcon_ZygardeComplete[] = INCBIN_U8("graphics/pokemon/zygarde/complete/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - //const u32 gObjectEventPic_ZygardeComplete[] = INCBIN_COMP("graphics/pokemon/zygarde/complete/overworld.4bpp"); + const u32 gObjectEventPic_ZygardeComplete[] = INCBIN_COMP("graphics/pokemon/zygarde/complete/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - //const u32 gOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_normal.gbapal.lz"); - //const u32 gShinyOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_ZYGARDE @@ -16464,10 +16464,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/shiny.gbapal.lz"); const u8 gMonIcon_OricorioPomPom[] = INCBIN_U8("graphics/pokemon/oricorio/pom_pom/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioPomPom[] = INCBIN_COMP("graphics/pokemon/oricorio/pom_pom/overworld.4bpp"); + const u32 gObjectEventPic_OricorioPomPom[] = INCBIN_COMP("graphics/pokemon/oricorio/pom_pom/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16477,10 +16477,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/shiny.gbapal.lz"); const u8 gMonIcon_OricorioPau[] = INCBIN_U8("graphics/pokemon/oricorio/pau/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioPau[] = INCBIN_COMP("graphics/pokemon/oricorio/pau/overworld.4bpp"); + const u32 gObjectEventPic_OricorioPau[] = INCBIN_COMP("graphics/pokemon/oricorio/pau/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS @@ -16490,10 +16490,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/shiny.gbapal.lz"); const u8 gMonIcon_OricorioSensu[] = INCBIN_U8("graphics/pokemon/oricorio/sensu/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_OricorioSensu[] = INCBIN_COMP("graphics/pokemon/oricorio/sensu/overworld.4bpp"); + const u32 gObjectEventPic_OricorioSensu[] = INCBIN_COMP("graphics/pokemon/oricorio/sensu/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_ORICORIO @@ -17718,10 +17718,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/shiny.gbapal.lz"); const u8 gMonIcon_MagearnaOriginalColor[] = INCBIN_U8("graphics/pokemon/magearna/original_color/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MagearnaOriginalColor[] = INCBIN_COMP("graphics/pokemon/magearna/original_color/overworld.4bpp"); + const u32 gObjectEventPic_MagearnaOriginalColor[] = INCBIN_COMP("graphics/pokemon/magearna/original_color/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MagearnaOriginalColor[] = INCBIN_U32("graphics/pokemon/magearna/original_color/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_MAGEARNA 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 1e20ef3798..6ad602a629 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -3078,9 +3078,9 @@ static const struct SpriteFrameImage sPicTable_Darkrai[] = { static const struct SpriteFrameImage sPicTable_ShayminLand[] = { overworld_ascending_frames(gObjectEventPic_ShayminLand, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_ShayminSky[] = { +static const struct SpriteFrameImage sPicTable_ShayminSky[] = { overworld_ascending_frames(gObjectEventPic_ShayminSky, 4, 4), -};*/ +}; #endif //P_FAMILY_SHAYMIN #if P_FAMILY_ARCEUS @@ -3914,9 +3914,9 @@ static const struct SpriteFrameImage sPicTable_Virizion[] = { static const struct SpriteFrameImage sPicTable_TornadusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_TornadusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_TornadusTherian[] = { +static const struct SpriteFrameImage sPicTable_TornadusTherian[] = { overworld_ascending_frames(gObjectEventPic_TornadusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_TORNADUS #if P_FAMILY_THUNDURUS @@ -3924,9 +3924,9 @@ static const struct SpriteFrameImage sPicTable_TornadusIncarnate[] = { static const struct SpriteFrameImage sPicTable_ThundurusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_ThundurusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_ThundurusTherian[] = { +static const struct SpriteFrameImage sPicTable_ThundurusTherian[] = { overworld_ascending_frames(gObjectEventPic_ThundurusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM @@ -3946,9 +3946,9 @@ static const struct SpriteFrameImage sPicTable_Zekrom[] = { static const struct SpriteFrameImage sPicTable_LandorusIncarnate[] = { overworld_ascending_frames(gObjectEventPic_LandorusIncarnate, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_LandorusTherian[] = { +static const struct SpriteFrameImage sPicTable_LandorusTherian[] = { overworld_ascending_frames(gObjectEventPic_LandorusTherian, 4, 4), -};*/ +}; #endif //P_FAMILY_LANDORUS #if P_FAMILY_ENAMORUS @@ -3965,12 +3965,12 @@ static const struct SpriteFrameImage sPicTable_Kyurem[] = { overworld_ascending_frames(gObjectEventPic_Kyurem, 4, 4), }; #if P_FUSION_FORMS -/*static const struct SpriteFrameImage sPicTable_KyuremWhite[] = { +static const struct SpriteFrameImage sPicTable_KyuremWhite[] = { overworld_ascending_frames(gObjectEventPic_KyuremWhite, 4, 4), }; static const struct SpriteFrameImage sPicTable_KyuremBlack[] = { overworld_ascending_frames(gObjectEventPic_KyuremBlack, 4, 4), -};*/ +}; #endif //P_FUSION_FORMS #endif //P_FAMILY_KYUREM @@ -4416,7 +4416,7 @@ static const struct SpriteFrameImage sPicTable_Trevenant[] = { static const struct SpriteFrameImage sPicTable_PumpkabooAverage[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooAverage, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_PumpkabooSmall[] = { +static const struct SpriteFrameImage sPicTable_PumpkabooSmall[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooSmall, 4, 4), }; static const struct SpriteFrameImage sPicTable_PumpkabooLarge[] = { @@ -4424,12 +4424,12 @@ static const struct SpriteFrameImage sPicTable_PumpkabooLarge[] = { }; static const struct SpriteFrameImage sPicTable_PumpkabooSuper[] = { overworld_ascending_frames(gObjectEventPic_PumpkabooSuper, 4, 4), -};*/ +}; static const struct SpriteFrameImage sPicTable_GourgeistAverage[] = { overworld_ascending_frames(gObjectEventPic_GourgeistAverage, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_GourgeistSmall[] = { +static const struct SpriteFrameImage sPicTable_GourgeistSmall[] = { overworld_ascending_frames(gObjectEventPic_GourgeistSmall, 4, 4), }; static const struct SpriteFrameImage sPicTable_GourgeistLarge[] = { @@ -4437,7 +4437,7 @@ static const struct SpriteFrameImage sPicTable_GourgeistLarge[] = { }; static const struct SpriteFrameImage sPicTable_GourgeistSuper[] = { overworld_ascending_frames(gObjectEventPic_GourgeistSuper, 4, 4), -};*/ +}; #endif //P_FAMILY_PUMPKABOO #if P_FAMILY_BERGMITE @@ -4484,12 +4484,12 @@ static const struct SpriteFrameImage sPicTable_Yveltal[] = { static const struct SpriteFrameImage sPicTable_Zygarde50[] = { overworld_ascending_frames(gObjectEventPic_Zygarde50, 4, 4), }; -//static const struct SpriteFrameImage sPicTable_Zygarde10[] = { -// overworld_ascending_frames(gObjectEventPic_Zygarde10, 4, 4), -//}; -//static const struct SpriteFrameImage sPicTable_ZygardeComplete[] = { -// overworld_ascending_frames(gObjectEventPic_ZygardeComplete, 4, 4), -//}; +static const struct SpriteFrameImage sPicTable_Zygarde10[] = { + overworld_ascending_frames(gObjectEventPic_Zygarde10, 4, 4), +}; +static const struct SpriteFrameImage sPicTable_ZygardeComplete[] = { + overworld_ascending_frames(gObjectEventPic_ZygardeComplete, 4, 4), +}; #endif //P_FAMILY_ZYGARDE @@ -4607,7 +4607,7 @@ static const struct SpriteFrameImage sPicTable_Crabominable[] = { static const struct SpriteFrameImage sPicTable_OricorioBaile[] = { overworld_ascending_frames(gObjectEventPic_OricorioBaile, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_OricorioPomPom[] = { +static const struct SpriteFrameImage sPicTable_OricorioPomPom[] = { overworld_ascending_frames(gObjectEventPic_OricorioPomPom, 4, 4), }; static const struct SpriteFrameImage sPicTable_OricorioPau[] = { @@ -4615,7 +4615,7 @@ static const struct SpriteFrameImage sPicTable_OricorioPau[] = { }; static const struct SpriteFrameImage sPicTable_OricorioSensu[] = { overworld_ascending_frames(gObjectEventPic_OricorioSensu, 4, 4), -};*/ +}; #endif //P_FAMILY_ORICORIO #if P_FAMILY_CUTIEFLY @@ -4967,9 +4967,9 @@ static const struct SpriteFrameImage sPicTable_NecrozmaDawnWings[] = { static const struct SpriteFrameImage sPicTable_Magearna[] = { overworld_ascending_frames(gObjectEventPic_Magearna, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_MagearnaOriginalColor[] = { +static const struct SpriteFrameImage sPicTable_MagearnaOriginalColor[] = { overworld_ascending_frames(gObjectEventPic_MagearnaOriginalColor, 4, 4), -};*/ +}; #endif //P_FAMILY_MAGEARNA #if P_FAMILY_MARSHADOW diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 386418fa2c..72b4e43c0b 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2088,6 +2088,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_RaticateAlolan, .iconPalIndex = 2, FOOTPRINT(Raticate) + OVERWORLD( + sPicTable_RaticateAlolan, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_RaticateAlolan, + gShinyOverworldPalette_RaticateAlolan + ) .isTotem = TRUE, .isAlolanForm = TRUE, .levelUpLearnset = sRaticateAlolanLevelUpLearnset, @@ -3410,6 +3418,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndexFemale = 2, #endif FOOTPRINT(Pikachu) + OVERWORLD( + sPicTable_Pikachu, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pikachu, + gShinyOverworldPalette_Pikachu + ) .cannotBeTraded = TRUE, .allPerfectIVs = TRUE, .levelUpLearnset = sPikachuLevelUpLearnset, @@ -11842,6 +11858,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_MarowakAlolan, .iconPalIndex = 1, FOOTPRINT(Marowak) + OVERWORLD( + sPicTable_MarowakAlolan, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MarowakAlolan, + gShinyOverworldPalette_MarowakAlolan + ) .isTotem = TRUE, .isAlolanForm = TRUE, .levelUpLearnset = sMarowakAlolanLevelUpLearnset, @@ -15606,6 +15630,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndexFemale = 2, #endif FOOTPRINT(Eevee) + OVERWORLD( + sPicTable_Eevee, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Eevee, + gShinyOverworldPalette_Eevee + ) .cannotBeTraded = TRUE, .allPerfectIVs = TRUE, .levelUpLearnset = sEeveeLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 6b37bb2065..c0fdd1ecec 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -6348,6 +6348,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_ShayminSky, .iconPalIndex = 1, FOOTPRINT(Shaymin) + OVERWORLD( + sPicTable_ShayminSky, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ShayminSky, + gShinyOverworldPalette_ShayminSky + ) .isMythical = TRUE, .isFrontierBanned = TRUE, .levelUpLearnset = sShayminSkyLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index d73559f169..e8907999fe 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -11047,6 +11047,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_TornadusTherian, .iconPalIndex = 1, FOOTPRINT(Tornadus) + OVERWORLD( + sPicTable_TornadusTherian, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_TornadusTherian, + gShinyOverworldPalette_TornadusTherian + ) .isLegendary = TRUE, .levelUpLearnset = sTornadusLevelUpLearnset, .teachableLearnset = sTornadusTeachableLearnset, @@ -11169,6 +11177,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_ThundurusTherian, .iconPalIndex = 0, FOOTPRINT(Thundurus) + OVERWORLD( + sPicTable_ThundurusTherian, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ThundurusTherian, + gShinyOverworldPalette_ThundurusTherian + ) .isLegendary = TRUE, .levelUpLearnset = sThundurusLevelUpLearnset, .teachableLearnset = sThundurusTeachableLearnset, @@ -11418,6 +11434,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_LandorusTherian, .iconPalIndex = 0, FOOTPRINT(Landorus) + OVERWORLD( + sPicTable_LandorusTherian, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_LandorusTherian, + gShinyOverworldPalette_LandorusTherian + ) .isLegendary = TRUE, .levelUpLearnset = sLandorusLevelUpLearnset, .teachableLearnset = sLandorusTeachableLearnset, @@ -11549,6 +11573,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_KyuremWhite, .iconPalIndex = 0, FOOTPRINT(Kyurem) + OVERWORLD( + sPicTable_KyuremWhite, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_KyuremWhite, + gShinyOverworldPalette_KyuremWhite + ) .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, @@ -11612,6 +11644,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_KyuremBlack, .iconPalIndex = 0, FOOTPRINT(Kyurem) + OVERWORLD( + sPicTable_KyuremBlack, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_KyuremBlack, + gShinyOverworldPalette_KyuremBlack + ) .isLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 973f24e13d..5946ac5c44 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -4554,6 +4554,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Pumpkaboo, .iconPalIndex = 2, FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooSmall, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4609,6 +4617,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Pumpkaboo, .iconPalIndex = 2, FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooLarge, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4666,6 +4682,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Pumpkaboo, .iconPalIndex = 2, FOOTPRINT(Pumpkaboo) + OVERWORLD( + sPicTable_PumpkabooSuper, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Pumpkaboo, + gShinyOverworldPalette_Pumpkaboo + ) .levelUpLearnset = sPumpkabooLevelUpLearnset, .teachableLearnset = sPumpkabooTeachableLearnset, .eggMoveLearnset = sPumpkabooEggMoveLearnset, @@ -4783,6 +4807,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Gourgeist, .iconPalIndex = 2, FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistSmall, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -4836,6 +4868,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Gourgeist, .iconPalIndex = 2, FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistLarge, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -4891,6 +4931,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Gourgeist, .iconPalIndex = 2, FOOTPRINT(Gourgeist) + OVERWORLD( + sPicTable_GourgeistSuper, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Gourgeist, + gShinyOverworldPalette_Gourgeist + ) .levelUpLearnset = sGourgeistLevelUpLearnset, .teachableLearnset = sGourgeistTeachableLearnset, .formSpeciesIdTable = sGourgeistFormSpeciesIdTable, @@ -5578,6 +5626,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Zygarde10, .iconPalIndex = 1, FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_Zygarde10, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Zygarde10, + gShinyOverworldPalette_Zygarde10 + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -5631,6 +5687,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_Zygarde10, .iconPalIndex = 1, FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_Zygarde10, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_Zygarde10, + gShinyOverworldPalette_Zygarde10 + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -5688,6 +5752,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_ZygardeComplete, .iconPalIndex = 1, FOOTPRINT(Zygarde) + OVERWORLD( + sPicTable_ZygardeComplete, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_ZygardeComplete, + gShinyOverworldPalette_ZygardeComplete + ) .isLegendary = TRUE, .isFrontierBanned = TRUE, .levelUpLearnset = sZygardeLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 4669051d04..dfee119ed5 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -1481,6 +1481,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_OricorioPomPom, .iconPalIndex = 1, FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioPomPom, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioPomPom, + gShinyOverworldPalette_OricorioPomPom + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -1537,6 +1545,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_OricorioPau, .iconPalIndex = 1, FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioPau, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioPau, + gShinyOverworldPalette_OricorioPau + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -1593,6 +1609,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_OricorioSensu, .iconPalIndex = 0, FOOTPRINT(Oricorio) + OVERWORLD( + sPicTable_OricorioSensu, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_OricorioSensu, + gShinyOverworldPalette_OricorioSensu + ) .levelUpLearnset = sOricorioLevelUpLearnset, .teachableLearnset = sOricorioTeachableLearnset, .eggMoveLearnset = sOricorioEggMoveLearnset, @@ -4620,6 +4644,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_MimikyuDisguised, .iconPalIndex = 1, FOOTPRINT(Mimikyu) + OVERWORLD( + sPicTable_MimikyuDisguised, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MimikyuDisguised, + gShinyOverworldPalette_MimikyuDisguised + ) .isTotem = TRUE, .levelUpLearnset = sMimikyuLevelUpLearnset, .teachableLearnset = sMimikyuTeachableLearnset, @@ -6458,6 +6490,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_MagearnaOriginalColor, .iconPalIndex = 0, FOOTPRINT(Magearna) + OVERWORLD( + sPicTable_MagearnaOriginalColor, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + gOverworldPalette_MagearnaOriginalColor, + gShinyOverworldPalette_MagearnaOriginalColor + ) .isMythical = TRUE, .isFrontierBanned = TRUE, .levelUpLearnset = sMagearnaLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 2f63abf560..3f8257d966 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -3460,14 +3460,6 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .iconSprite = gMonIcon_ToxtricityGigantamax, .iconPalIndex = 0, FOOTPRINT(Toxtricity) - OVERWORLD( - sPicTable_ToxtricityLowKey, - SIZE_32x32, - SHADOW_SIZE_M, - TRACKS_FOOT, - gOverworldPalette_ToxtricityLowKey, - gShinyOverworldPalette_ToxtricityLowKey - ) .isGigantamax = TRUE, .levelUpLearnset = sToxtricityLowKeyLevelUpLearnset, .teachableLearnset = sToxtricityLowKeyTeachableLearnset, From 3d8b73300a1aaa6912327e718865c5cdba9d4197 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:46:59 +0200 Subject: [PATCH 07/34] Fixes Multi Hit moves removing destiny bond flag in the middle of attack (#5377) --- src/battle_script_commands.c | 3 ++- test/battle/move_effect/destiny_bond.c | 17 +++++++++++++++++ test/battle/move_effect/multi_hit.c | 25 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/battle/move_effect/destiny_bond.c diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d4afe23be4..08444ae569 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4686,7 +4686,8 @@ static void MoveValuesCleanUp(void) gIsCriticalHit = FALSE; gBattleScripting.moveEffect = 0; gBattleCommunication[MISS_TYPE] = 0; - gHitMarker &= ~HITMARKER_DESTINYBOND; + if (!gMultiHitCounter) + gHitMarker &= ~HITMARKER_DESTINYBOND; gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT; } diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c new file mode 100644 index 0000000000..baba378f6b --- /dev/null +++ b/test/battle/move_effect/destiny_bond.c @@ -0,0 +1,17 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the attack") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet took Foe Wobbuffet with it!"); + MESSAGE("Foe Wobbuffet fainted!"); + } +} diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index df9cfea807..fca9da8150 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -231,3 +231,28 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killi MESSAGE("Bagon's Speed rose!"); } } + +SINGLE_BATTLE_TEST("Multi Hit moves will not disrupt Destiny Bond flag") +{ + u32 hp; + PARAMETRIZE { hp = 11; } + PARAMETRIZE { hp = 55; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(55); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_BULLET_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + if (hp == 55) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, opponent); + } + MESSAGE("Wobbuffet took Foe Wobbuffet with it!"); + MESSAGE("Foe Wobbuffet fainted!"); + } +} From 8c0580828fd2f33afd887afc86f19922c59e3f92 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 13 Sep 2024 09:27:16 -0300 Subject: [PATCH 08/34] Apply suggestions from code review Co-authored-by: Bassoonian --- src/event_object_movement.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index c290456284..ef09ea93f3 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -3463,9 +3463,8 @@ bool8 MovementType_Wander_Step3(struct ObjectEvent *objectEvent, struct Sprite * ClearObjectEventMovement(objectEvent, sprite); sprite->sTypeFuncId = 4; return TRUE; - } else if ( - OW_MON_WANDER_WALK == TRUE - && IS_OW_MON_OBJ(objectEvent)) + } + else if (OW_MON_WANDER_WALK == TRUE && IS_OW_MON_OBJ(objectEvent)) { UpdateMonMoveInPlace(objectEvent, sprite); } @@ -5668,10 +5667,9 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) sprite->sTypeFuncId = 0; // similar to UpdateMonMoveInPlace - else if ( - OW_FOLLOWERS_BOBBING == TRUE - && IS_OW_MON_OBJ(objectEvent) - && (sprite->data[3] & 7) == 2) + else if (OW_FOLLOWERS_BOBBING == TRUE + && IS_OW_MON_OBJ(objectEvent) + && (sprite->data[3] & 7) == 2) { sprite->y2 ^= 1; } From 9633cefd11824249e58e10fa46c6f90c50723711 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 13 Sep 2024 15:30:01 +0200 Subject: [PATCH 09/34] Custom anim table follower macro & Farfetch'd example (#5309) Co-authored-by: Hedara --- include/event_object_movement.h | 1 + src/data/object_events/object_event_anims.h | 2 +- src/data/pokemon/species_info.h | 22 +++++++++++++++++++ .../pokemon/species_info/gen_1_families.h | 3 ++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 2906789b37..77da1ef1fd 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -113,6 +113,7 @@ extern const struct OamData gObjectEventBaseOam_64x64; extern const struct SubspriteTable sOamTables_32x32[]; extern const struct SubspriteTable sOamTables_64x64[]; extern const union AnimCmd *const sAnimTable_Following[]; +extern const union AnimCmd *const sAnimTable_Following_Asym[]; extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; extern const u8 gReflectionEffectPaletteMap[]; diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index bde3c3b0d5..d6229e57c9 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -1173,7 +1173,7 @@ const union AnimCmd *const sAnimTable_Following[] = { }; // Like the above, but has separate frames for facing right -static const union AnimCmd *const sAnimTable_Following_Asym[] = { +const union AnimCmd *const sAnimTable_Following_Asym[] = { [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 4f21223eee..de8423fb44 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -46,8 +46,30 @@ .affineAnims = gDummySpriteAffineAnimTable, \ }, \ OVERWORLD_PAL(__VA_ARGS__) + +#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) \ +.overworldData = { \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ + .size = (_size == SIZE_32x32 ? 512 : 2048), \ + .width = (_size == SIZE_32x32 ? 32 : 64), \ + .height = (_size == SIZE_32x32 ? 32 : 64), \ + .paletteSlot = PALSLOT_NPC_1, \ + .shadowSize = shadow, \ + .inanimate = FALSE, \ + .compressed = COMP, \ + .tracks = _tracks, \ + .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ + .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ + .anims = _anims, \ + .images = picTable, \ + .affineAnims = gDummySpriteAffineAnimTable, \ +}, \ + OVERWORLD_PAL(__VA_ARGS__) #else #define OVERWORLD(picTable, _size, shadow, _tracks, ...) +#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) #endif //OW_POKEMON_OBJECT_EVENTS // Maximum value for a female Pokémon is 254 (MON_FEMALE) which is 100% female. diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 72b4e43c0b..0acdc9dada 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -9515,11 +9515,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_Farfetchd, .iconPalIndex = 1, FOOTPRINT(Farfetchd) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Farfetchd, SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following_Asym, gOverworldPalette_Farfetchd, gShinyOverworldPalette_Farfetchd ) From 100c7dd8ad8f1419a6cd1e2d9248fdc26c7d79d4 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:08:23 +0100 Subject: [PATCH 10/34] Fixes Powder (status) interactions + tests (#5370) * Simplified fix from #4638 * Fixes interactions with Z-Moves, Magic Guard, Heavy Rain, Pledge * Powder Tests * Remove duplicate * Assume Powder is a powder move * Add config for Powder Rain interaction * Only primal rain * Z-Moves fix handled in Canceller_Z_Moves * Fix BattleScript name * Make sure Z-Move + Powder still damages user --- data/battle_scripts_1.s | 10 ++ include/battle_scripts.h | 1 + include/config/battle.h | 1 + src/battle_script_commands.c | 7 +- src/battle_util.c | 26 ++- test/battle/ability/dancer.c | 22 +++ test/battle/gimmick/zmove.c | 54 ++++++ test/battle/move_effect/pledge.c | 45 +++++ test/battle/move_effect/powder.c | 295 +++++++++++++++++++++++++++++++ 9 files changed, 452 insertions(+), 9 deletions(-) create mode 100644 test/battle/move_effect/powder.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e042201d94..0040c7e804 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9404,6 +9404,16 @@ BattleScript_ZMoveActivateStatus:: copybyte sSTATCHANGER, sSAVED_STAT_CHANGER return +BattleScript_ZMoveActivatePowder:: + flushtextbox + trytrainerslidezmovemsg + savetarget + printstring STRINGID_ZPOWERSURROUNDS + playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL + setzeffect + restoretarget + goto BattleScript_MoveUsedPowder + BattleScript_ZEffectPrintString:: printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG diff --git a/include/battle_scripts.h b/include/battle_scripts.h index fb1e72af24..893ab42a5e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -329,6 +329,7 @@ extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; extern const u8 BattleScript_MoveUsedPowder[]; +extern const u8 BattleScript_ZMoveActivatePowder[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeks[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeksInPalace[]; extern const u8 BattleScript_SelectingNotAllowedBelch[]; diff --git a/include/config/battle.h b/include/config/battle.h index 55091fb331..501c4162ee 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -122,6 +122,7 @@ #define B_KNOCK_OFF_REMOVAL GEN_LATEST // In Gen5+, Knock Off removes the foe's item instead of rendering it unusable. #define B_HEAL_BELL_SOUNDPROOF GEN_LATEST // In Gen5, Heal Bell affects all mons with Soundproof. In Gen6-8 it affects inactive mons, but not battlers. In Gen9 it always affects the user. #define B_CHARGE GEN_LATEST // In Gen8-, Charge status is lost regardless of the typing of the next move. +#define B_POWDER_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. // Ability settings #define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 08444ae569..59ff47018e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6291,19 +6291,20 @@ static void Cmd_moveend(void) if (gMovesInfo[gCurrentMove].danceMove) { u32 battler, nextDancer = 0; - bool32 turnOnHitmarker = FALSE; + bool32 hasDancerTriggered = FALSE; for (battler = 0; battler < gBattlersCount; battler++) { if (gSpecialStatuses[battler].dancerUsedMove) { // in case a battler fails to act on a Dancer-called move - turnOnHitmarker = TRUE; + hasDancerTriggered = TRUE; break; } } if (!(gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) + || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE && !hasDancerTriggered) || (!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 @@ -6317,8 +6318,6 @@ static void Cmd_moveend(void) { if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) { - if (turnOnHitmarker) - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) nextDancer = battler | 0x4; } diff --git a/src/battle_util.c b/src/battle_util.c index b2cf51ba0c..78491d2756 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3558,11 +3558,20 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) case CANCELLER_POWDER_STATUS: if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) { - if (moveType == TYPE_FIRE) + u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + if ((moveType == TYPE_FIRE && !gBattleStruct->pledgeMove) + || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) + || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove)) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD + && (B_POWDER_RAIN < GEN_7 || !IsBattlerWeatherAffected(gBattlerAttacker, B_WEATHER_RAIN_PRIMAL))) + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE + || gBattleStruct->obedienceResult != OBEYS + || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; effect = 1; } @@ -3592,7 +3601,15 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); gBattleScripting.battler = gBattlerAttacker; - if (gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) + if (gProtectStructs[gBattlerAttacker].powderSelfDmg) + { + if (!alreadyUsed) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; + } + } + else if (gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) { if (!alreadyUsed) { @@ -6058,7 +6075,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(battler) && (gMovesInfo[gCurrentMove].danceMove) && !gSpecialStatuses[battler].dancerUsedMove - && (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) && gBattlerAttacker != battler) { // Set bit and save Dancer mon's original target diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index 660a719c69..b39fa291c8 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -145,3 +145,25 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") MESSAGE("It's super effective!"); } } + +DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FIERY_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_FIERY_DANCE].type == TYPE_FIRE); + PLAYER(SPECIES_VOLCARONA); + PLAYER(SPECIES_ORICORIO); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, MOVE_FIERY_DANCE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerLeft); + HP_BAR(opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerRight); + } + } +} diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 51c6516106..4e6fc26cae 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -397,6 +397,60 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk turns Weather Ball into Breakneck Blit } } +SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves and deals 25% of maximum HP to the user") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_INFERNO_OVERDRIVE, player); + } THEN { + EXPECT_MUL_EQ(player->maxHP, UQ_4_12(0.75), player->hp); + } +} + +DOUBLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves (from Z-Mirror Move)") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].type == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FLYINIUM_Z); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_EMBER, target: playerLeft); MOVE(playerLeft, MOVE_MIRROR_MOVE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_INFERNO_OVERDRIVE, playerLeft); + } +} + +SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves but not boosts granted") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_WILL_O_WISP].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_WILL_O_WISP].zMove.effect == Z_EFFECT_ATK_UP_1); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_WILL_O_WISP, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WILL_O_WISP, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + // Miscellaneous Interactions DOUBLE_BATTLE_TEST("(Z-MOVE) Instruct fails if the target last used a Z-Move") { diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index d2cc16aa47..2098217827 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -331,6 +331,51 @@ DOUBLE_BATTLE_TEST("Damage calculation: Combined pledge move") } } +DOUBLE_BATTLE_TEST("Pledge move combo interactions with Powder are correct") +{ + // Fire Pledge as the first move or Fire Pledge combo should fail + u32 moveLeft, moveRight, speedLeft, speedRight; + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 4; speedRight = 3; } // FAIL 1 + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 3; speedRight = 4; } + PARAMETRIZE { moveLeft = MOVE_WATER_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } + PARAMETRIZE { moveLeft = MOVE_WATER_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 3; speedRight = 4; } + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_GRASS_PLEDGE; speedLeft = 4; speedRight = 3; } // FAIL 1 + PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_GRASS_PLEDGE; speedLeft = 3; speedRight = 4; } // FAIL 2 + PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } + PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 3; speedRight = 4; } // FAIL 2 + GIVEN { + ASSUME(gMovesInfo[MOVE_FIRE_PLEDGE].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Speed(speedLeft); } + PLAYER(SPECIES_WYNAUT) { Speed(speedRight); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } + OPPONENT(SPECIES_VIVILLON) { Speed(5); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, moveLeft, target: opponentLeft); MOVE(playerRight, moveRight, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + if (speedLeft > speedRight && moveLeft == MOVE_FIRE_PLEDGE) { // FAIL 1 + NOT ANIMATION(ANIM_TYPE_MOVE, moveLeft, playerLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, moveRight, playerRight); + } + else if (speedLeft > speedRight) { + NOT HP_BAR(playerLeft); + if (moveLeft == MOVE_GRASS_PLEDGE) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerRight); + else + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerRight); + } + else if (moveLeft == MOVE_WATER_PLEDGE || moveRight == MOVE_WATER_PLEDGE) { + NOT HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + } + else { // FAIL 2 + HP_BAR(playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + } +} + DOUBLE_BATTLE_TEST("Pledge move combo fails if ally fails to act - Sleep Right") { u32 speedPLeft, speedPRight, speedOLeft, speedORight; diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c new file mode 100644 index 0000000000..dbd1570e6c --- /dev/null +++ b/test/battle/move_effect/powder.c @@ -0,0 +1,295 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_POWDER].effect == EFFECT_POWDER); + ASSUME(gMovesInfo[MOVE_POWDER].powderMove == TRUE); + ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); +} + + +SINGLE_BATTLE_TEST("Powder blocks the target's Fire type moves and deals 25% of maximum HP to target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_MUL_EQ(player->maxHP, UQ_4_12(0.75), player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder blocks the target's Fire type moves and consumes PP") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_EMBER); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->pp[0], gMovesInfo[MOVE_EMBER].pp - 1); + } +} + +SINGLE_BATTLE_TEST("Powder only blocks the target's Fire type moves on the same turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") +{ + GIVEN { + PLAYER(SPECIES_ALAKAZAM) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") +{ + GIVEN { + ASSUME(B_POWDER_RAIN >= GEN_7); + PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->maxHP, player->hp); + } +} + +DOUBLE_BATTLE_TEST("Powder blocks the target's Fire type moves even if it doesn't target Powder user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VIVILLON); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_POWDER, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentLeft); + } +} + +SINGLE_BATTLE_TEST("Powder fails if the target is Grass type") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_VENUSAUR].types[0] == TYPE_GRASS || gSpeciesInfo[SPECIES_VENUSAUR].types[1] == TYPE_GRASS); + PLAYER(SPECIES_VENUSAUR); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat") +{ + GIVEN { + PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } +} + +DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Grass type") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].effect == EFFECT_THIRD_TYPE); + ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].argument == TYPE_GRASS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TREVENANT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, MOVE_FORESTS_CURSE, target: playerLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FORESTS_CURSE, opponentLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Overcoat") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DOODLE].effect == EFFECT_DOODLE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(playerRight, MOVE_DOODLE, target: opponentLeft); MOVE(playerLeft, MOVE_EMBER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, playerLeft); + HP_BAR(opponentLeft); + } + } THEN { + EXPECT_EQ(playerLeft->ability, ABILITY_OVERCOAT); + } +} + +SINGLE_BATTLE_TEST("Powder prevents Protean from changing its user to Fire type") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Powder doesn't prevent a Fire move from thawing its user out") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].thawsUser); + ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].type == TYPE_FIRE); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_FLAME_WHEEL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + MESSAGE("Wobbuffet was defrosted by Flame Wheel!"); + STATUS_ICON(player, none: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLAME_WHEEL, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Powder doesn't consume Berry from Fire type Natural Gift but prevents using the move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHERI_BERRY); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_NATURAL_GIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->item, ITEM_CHERI_BERRY); + } +} + +DOUBLE_BATTLE_TEST("Powder damages a target using Shell Trap even if it wasn't hit by a Physical move") +{ + u32 move; + PARAMETRIZE { move = MOVE_TACKLE; } + PARAMETRIZE { move = MOVE_EMBER; } + PARAMETRIZE { move = MOVE_TICKLE;} + GIVEN { + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].effect == EFFECT_SHELL_TRAP); + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].type == TYPE_FIRE); + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(gMovesInfo[MOVE_TICKLE].category == DAMAGE_CATEGORY_STATUS); + ASSUME(gMovesInfo[MOVE_TICKLE].effect == EFFECT_TICKLE); + PLAYER(SPECIES_TURTONATOR); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SHELL_TRAP); MOVE(opponentRight, MOVE_POWDER, target: playerLeft); MOVE(opponentLeft, move, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + if (move != MOVE_TICKLE) + HP_BAR(playerLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } + HP_BAR(playerLeft); + } +} From c7e1e857f376e4f30fde11f3e640c51ba68da0ef Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:17:59 +0100 Subject: [PATCH 11/34] Fix After You/Shell Trap not updating battlers' actions correctly (#5384) --- src/battle_script_commands.c | 12 ++++++++++ test/battle/move_effect/after_you.c | 34 ++++++++++++++++++++++++++++ test/battle/move_effect/shell_trap.c | 32 ++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 59ff47018e..c33fce7fae 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8930,29 +8930,41 @@ static bool32 ChangeOrderTargetAfterAttacker(void) { u32 i; u8 data[MAX_BATTLERS_COUNT]; + u8 actionsData[MAX_BATTLERS_COUNT]; if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) || GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) return FALSE; for (i = 0; i < gBattlersCount; i++) + { data[i] = gBattlerByTurnOrder[i]; + actionsData[i] = gActionsByTurnOrder[i]; + } if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 2) { gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[2]; gBattlerByTurnOrder[2] = data[1]; + gActionsByTurnOrder[2] = actionsData[1]; gBattlerByTurnOrder[3] = data[3]; + gActionsByTurnOrder[3] = actionsData[3]; } else if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 3) { gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[3]; gBattlerByTurnOrder[2] = data[1]; + gActionsByTurnOrder[2] = actionsData[1]; gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; } else // Attacker == 1, Target == 3 { gBattlerByTurnOrder[2] = gBattlerTarget; + gActionsByTurnOrder[2] = actionsData[3]; gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; } return TRUE; } diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index fa6e47e0e2..b788fab725 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -52,5 +52,39 @@ DOUBLE_BATTLE_TEST("After You does nothing if the target has already moved") } } +DOUBLE_BATTLE_TEST("After You calculates correct targets if only one pokemon is left on the opposing side") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Speed(120); } + PLAYER(SPECIES_REGIROCK) { Speed(10); } + OPPONENT(SPECIES_PIDGEOT) { Speed(100); } + OPPONENT(SPECIES_DRAGONITE) { Speed(60); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_AFTER_YOU, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + } + TURN { + MOVE(playerLeft, MOVE_AFTER_YOU, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentRight); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, playerLeft); + MESSAGE("Regirock took the kind offer!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentLeft); + MESSAGE("Foe Pidgeot fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, playerLeft); + MESSAGE("Regirock took the kind offer!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + } +} + TO_DO_BATTLE_TEST("After You doesn't fail if the turner remains the same after After You (Gen8+)"); TO_DO_BATTLE_TEST("After You ignores the effects of Quash"); diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index cd63be2376..40febf040e 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -166,3 +166,35 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 a HP_BAR(opponentRight); } } + +DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fainted") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + PLAYER(SPECIES_GRENINJA) { Speed(60); } + PLAYER(SPECIES_TURTONATOR) { Speed(10); } + OPPONENT(SPECIES_BLASTOISE) { Speed(120); } + OPPONENT(SPECIES_SCIZOR) { Speed(100); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_TACKLE, target: playerRight); + MOVE(playerRight, MOVE_SHELL_TRAP); + } + TURN { + MOVE(opponentLeft, MOVE_TACKLE, target: playerRight); + MOVE(playerRight, MOVE_SHELL_TRAP); + } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerRight); + MESSAGE("Foe Scizor fainted!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} From 79776bf6bbd3421ef5fd0a6978041f330981d3a0 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 14 Sep 2024 04:45:26 -0400 Subject: [PATCH 12/34] ShouldSwitchIfWonderGuard tests and cleanup (#5383) --- include/random.h | 3 ++- src/battle_ai_switch_items.c | 6 ++--- test/battle/ai/ai_switching.c | 49 ++++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/include/random.h b/include/random.h index d254a08f03..b2eddce27d 100644 --- a/include/random.h +++ b/include/random.h @@ -199,7 +199,8 @@ enum RandomTag RNG_TRACE, RNG_FICKLE_BEAM, RNG_AI_ABILITY, - RNG_AI_HASBADODDS, + RNG_AI_SWITCH_HASBADODDS, + RNG_AI_SWITCH_WONDER_GUARD, RNG_SHELL_SIDE_ARM, }; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c19cbd05c5..c959e99674 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -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 (!RandomPercentage(RNG_AI_HASBADODDS, 50)) + if (!RandomPercentage(RNG_AI_SWITCH_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 (!RandomPercentage(RNG_AI_HASBADODDS, 50)) + if (!RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50)) return FALSE; // Switch mon out @@ -284,7 +284,7 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler, bool32 emitResult) move = GetMonData(&party[i], MON_DATA_MOVE1 + j); if (move != MOVE_NONE) { - if (AI_GetTypeEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && Random() % 3 < 2) + if (AI_GetTypeEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, 66) || ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)))) { // We found a mon. gBattleStruct->AI_monToSwitchIntoId[battler] = i; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index b3927509f0..6fb9b499d9 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -360,7 +360,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon 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); + PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); @@ -375,3 +375,50 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would TURN { MOVE(player, MOVE_THUNDERBOLT) ; EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to a mon with Wonder Guard 66% of the time") +{ + u32 aiOmniscientFlag = 0; + PARAMETRIZE { aiOmniscientFlag = 0; } + PARAMETRIZE { aiOmniscientFlag = AI_FLAG_OMNISCIENT; } + PASSES_RANDOMLY(66, 100, RNG_AI_SWITCH_WONDER_GUARD); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiOmniscientFlag); + PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + if(aiOmniscientFlag == 0) { + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } + else { + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } + + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't deal damage to a mon with Wonder Guard 100% of the time") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_WONDER_GUARD); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); + ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); + ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } + } +} From 9d483cee5d46116043762197210edfb3b4af61b5 Mon Sep 17 00:00:00 2001 From: Liamjd14 Date: Sat, 14 Sep 2024 19:21:34 +0100 Subject: [PATCH 13/34] Enable asym for followers issue #5382 (#5385) * Applies asym code to followers galarian slowbro tinkaton line scovillain --- graphics/pokemon/scovillain/overworld.png | Bin 1337 -> 1338 bytes .../pokemon/slowbro/galarian/overworld.png | Bin 1099 -> 1096 bytes graphics/pokemon/tinkaton/overworld.png | Bin 1606 -> 1587 bytes .../pokemon/species_info/gen_1_families.h | 3 ++- .../pokemon/species_info/gen_9_families.h | 16 ++++++++-------- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/graphics/pokemon/scovillain/overworld.png b/graphics/pokemon/scovillain/overworld.png index ed7dfcaedc9b6ae55f1af184e552e0bc06e7ba88..6eb5fac3e42c23de2b395877a3dc18716dc363af 100644 GIT binary patch delta 1245 zcmV<31S0#n3c3oAZGX5)L_t(&f$dm}lH({0G(on&ul)btUQ1vb%)^pG6pH2qNp%)MID z(On|^<=r6pq)#&X3|GPatOCYZ)cU%rB^oExGGLr|O&lkz_xowXWXf5Iv{Z9nGqO7K4nGP| zI7HW2M0}CttvKaDpAQ%wMC`IGWM6X@zNjVgd8N7~`YPb7mwa5umbFL8+SUuLUL3aKZJm$2jIu8%JS*zOD$&S6$q zaA;)4d4Gut+z1XF7|Lguz?Q-pL6(P7ptHkhu?ivv&^>-WH1v$11kW6T42(+*HPI9f zI?nmSAUA!=JwP{xSBpxtFVky~3%@%=Vd)q& zl5no_oD+iteX9H;MP*pDIMnF$OqV37H#BzaupF*(Kxrkn>ePe*FB~!)9rpUF^Uv_k z9~R*mQN#!akwdDEBl@<<7iGhh7AJVUG=J^z>O>`Stv{1ayl}{ggI;%i7Z0TzHY@5M zv@1<~b51VSZrxj);nlPlE228*kfB~-f)@^nI38{|L)z=RcpTAYKgRK-m#e+*0Y`y; zg|rTz4FZoixZy>=#Lr5_X02`1#+j-|$H%x-xNhG2t@+=iN1Qf~7dLTMoF4ucvwvcT zd&kZFTEX!Q39X{bPK`ktFxlhH;+oSm3_x z*xTE?aZo72j9CqW`z9bNYpsuXWBnCp=MMiWt_*o^Mt;I$fo}xm{k=B`D6)410z+`z zo9lsWI;&R(4rJs3%LWWL?{D-W$5s(qmo*jG!?JGTK%F|zaT>Y;p$gQ{TMxV`&^7Pf zKLe>cf$7~oH;xGpi5r{uRzO#vhZMlu>ytpgnee++|NHR|BEUe^wlI1C00000NkvXX Hu0mjf!mdVz delta 1244 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 diff --git a/graphics/pokemon/tinkaton/overworld.png b/graphics/pokemon/tinkaton/overworld.png index 702afdab9dde80da17c64aa28814a6e310c4eeb6..382f3b4200e797e5919151d171553f3cbf56dc68 100644 GIT binary patch delta 1496 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 R&#V9d002ovPDHLkV1k!$_Vxe( diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 0acdc9dada..7082e64464 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -9176,11 +9176,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_SlowbroGalarian, .iconPalIndex = 0, FOOTPRINT(Slowbro) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_SlowbroGalarian, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following_Asym, gOverworldPalette_SlowbroGalarian, gShinyOverworldPalette_SlowbroGalarian ) diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 554c0c1d9b..650b3c5a07 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -3215,12 +3215,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Scovillain, .iconPalIndex = 1, FOOTPRINT(Scovillain) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Scovillain, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Scovillain, gShinyOverworldPalette_Scovillain ) @@ -3526,12 +3526,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Tinkatink, .iconPalIndex = 1, FOOTPRINT(Tinkatink) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkatink, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkatink, gShinyOverworldPalette_Tinkatink ) @@ -3589,12 +3589,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Tinkatuff, .iconPalIndex = 1, FOOTPRINT(Tinkatuff) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkatuff, SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkatuff, gShinyOverworldPalette_Tinkatuff ) @@ -3651,12 +3651,12 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Tinkaton, .iconPalIndex = 1, FOOTPRINT(Tinkaton) - OVERWORLD( + OVERWORLD_SET_ANIM( sPicTable_Tinkaton, SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, - //sAnimTable_Following_Asym, + sAnimTable_Following_Asym, gOverworldPalette_Tinkaton, gShinyOverworldPalette_Tinkaton ) From 0d7c193e4c6a99c5cb3424f709e73b4a91a18a29 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 15 Sep 2024 01:55:03 +0200 Subject: [PATCH 14/34] fixes Micle Berry not increasing accuracy on the next turn (#5358) * fixes Micle Berry not increasing accuracy on the next turn * adds bitfield instead of using protect struct * test from pawkkie * ndebug * renaming * delete redundant comment * typo * micle berry more detailed descriptions --- include/battle.h | 3 ++- src/battle_script_commands.c | 5 ++-- src/battle_util.c | 3 +-- test/battle/hold_effect/micle_berry.c | 33 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/battle.h b/include/battle.h index 1729c76b3d..91233c8fe8 100644 --- a/include/battle.h +++ b/include/battle.h @@ -184,9 +184,9 @@ struct ProtectStruct u32 powderSelfDmg:1; u32 usedThroatChopPreventedMove:1; u32 statRaised:1; - u32 usedMicleBerry:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; + u32 unused:1; // End of 32-bit bitfield u16 disableEjectPack:1; u16 statFell:1; @@ -802,6 +802,7 @@ struct BattleStruct u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 fickleBeamBoosted:1; u8 obedienceResult:3; + u8 usedMicleBerry; }; // The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c33fce7fae..04f3c966bb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1689,9 +1689,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u break; } - if (gProtectStructs[battlerAtk].usedMicleBerry) + if (gBattleStruct->usedMicleBerry & 1u << battlerAtk) { - gProtectStructs[battlerAtk].usedMicleBerry = FALSE; if (atkAbility == ABILITY_RIPEN) calc = (calc * 140) / 100; // ripen gives 40% acc boost else @@ -6417,7 +6416,6 @@ static void Cmd_moveend(void) DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); // #endif } - gBattleStruct->targetsDone[gBattlerAttacker] = 0; gProtectStructs[gBattlerAttacker].targetAffected = FALSE; gProtectStructs[gBattlerAttacker].shellTrap = FALSE; @@ -6438,6 +6436,7 @@ static void Cmd_moveend(void) gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; gBattleStruct->distortedTypeMatchups = 0; + gBattleStruct->usedMicleBerry &= ~(1u << gBattlerAttacker); if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) diff --git a/src/battle_util.c b/src/battle_util.c index 78491d2756..a3711f161c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6825,8 +6825,7 @@ static u8 TrySetMicleBerry(u32 battler, u32 itemId, bool32 end2) { if (HasEnoughHpToEatBerry(battler, 4, itemId)) { - gProtectStructs[battler].usedMicleBerry = TRUE; // battler's next attack has increased accuracy - + gBattleStruct->usedMicleBerry |= 1u << battler; if (end2) { BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 2bc44c8069..87f6742609 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -64,3 +64,36 @@ SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2") ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBMISSION, player); } } + +SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move across turns") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, player); + } +} + +SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move the same turn the berry was triggered") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, player); + } +} From 3433567188e539fdf99427894222ead271789f86 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 15 Sep 2024 20:28:04 +0200 Subject: [PATCH 15/34] Gourgeist and Pumpkaboo follower sizes (#5390) * Gourgeist sizes * Gourgeist all sizes * Pumpkaboo small * Added all sizes of Pumpkaboo * Resized Gourgeist (no more Titan) --------- Co-authored-by: Hedara --- graphics/pokemon/gourgeist/large/overworld.png | Bin 949 -> 895 bytes graphics/pokemon/gourgeist/overworld.png | Bin 949 -> 819 bytes graphics/pokemon/gourgeist/small/overworld.png | Bin 949 -> 619 bytes graphics/pokemon/gourgeist/super/overworld.png | Bin 949 -> 1149 bytes graphics/pokemon/pumpkaboo/large/overworld.png | Bin 522 -> 597 bytes graphics/pokemon/pumpkaboo/overworld.png | Bin 522 -> 512 bytes graphics/pokemon/pumpkaboo/small/overworld.png | Bin 522 -> 429 bytes graphics/pokemon/pumpkaboo/super/overworld.png | Bin 522 -> 769 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/gourgeist/large/overworld.png b/graphics/pokemon/gourgeist/large/overworld.png index f2184b2cfc5642092ba824963e6af6c2affac397..e542ea438599630e83dc2972b8fa25a5e4aff7ea 100644 GIT binary patch delta 835 zcmV-J1HAmT2mc0;7#0Wv0001UMu)cm0004VQb$4nuFf3kkv=tl0|rS%K~z|U?U><` zq#z80M+1T*@Bh5l3Fx4P~Tpj z&$DI0;g7-z&~oVUJ%MM?=JY+MnS$le<26Ar=gH%MW&t)QiuM#Zyc&GOWuDDl;1uW> z^f)Uf)1t@2WT)_dIK^P+w|Q7%N^u!Ve4ZZh7xQE|ba;q-fBXz2E>CTI$wd$ihYk-h zqQWKOs!Cjr%Ge&J=_@VL@Z5v-hzgHXXxhjx3j>(GO`C0IBm~)29;U)nGyz#*Im;5=v zAX>~D_E?Jt?zk=>stq2-AN(Zf4Wd6G(YOHcL>C_LT&M}A48fMCmS7Rx2lreROwu1K z{@|UU^9KQc$tKYYpoy4c6P^n|f<+oQ7xq`?x>#aer3XH7O+W<(BjqxR?|3KZ`b)CS zhYumaDPBLzgFM=ak0}KmE`?96$P^9(p)Qb~D+1=k{*3s8cY@A;^|$G#jotp8g|N-aIKJbZ;Nzc<3L$TQY6aAAQ8-a;;0l9d8!q}tyRT4NH1m26DbD87sXnDvPL*cu+CY+s{>=zJIHs~x%!x(u7E-OUceZWRY1kV z0;B>Ay@9obl@DI3sO$|M#*1K3|0)%XSBS$!)7GgjsJ(%^;Y%S+g@+N(V-%0*w*Cg6 z0}ihuLJ^|^`Gws1a_L#Td~Ia(M{e%F*N;;o{LNQmPvXf<;4A*S@dw;XC01rkh_?U$ N002ovPDHLkV1g{vkx~Ev delta 889 zcmV-<1BU$n2DJx}7$yV*0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP zkuEiV010qNS#tmY4#NNd4#NS*Z>VGd00S3EL_t(Y$L*FekJ>O8hD{xH=9s(SEWIj2 zF2)U9Z$P?(4A(7~{DGsn9fJ4L0qK~o(^X9E)NU2aN!O*J16BD^wVgn0qvR@8>eO#Q zdYt%sA3Gur_+NiqNA+s{+p3{vH6MWrhFHIUYBH~e(eRM#73?8byK1tSaE`0lYgVw= zvh@Ii#e{A(Vl7SImFfw)Aq!l1Pb>Vb^Xg3j1rk(#YxV)eHH=N2;K?sg7eu}eI{^!PWEg~`TW}a;l9or#$6DMsGGAzhm%~uk3vmA za4sMl-mC&&4Y*m2cWjM@A@F`ZENnn}e9e72a&v|QdX)>zqP8X=ITH|dG9#>|1e{

WAl+;ijv|nMF~|?4&W|_AYZhyB#2U{sUBHpJU|oR^9upELLmr4@b)tQh+SWv!3;=XFcm#|IrHJD;~b$fS-KEB|(g? zf(d8*1xJjo!WrKacnW@h!SVMTkz9o{-Vk3UEaq|)e2X{fS-~f<+4TdK0@E6VodI>04 ziR=nIek7p!(gaHFd;$!;5-R>M)~nc$ovU z0E6!WLt}%jg%5#$lJLTD{i^Q*(Rg>jExHTbv zIBo)^Z#RCq6o){0t0dI6`~MV(J^q_3mnxSg=k#XXw*3r9(D;ZK;@Y;_R=z9m2_P>B z;dMLsB}^9>Vyir*t$q40!~f(X;HQ4Ms5YYl3|v(%@pyxOUMuT=@kZSRb{pZXcD~%{ z@NcZHjuxr@Z?3FR!Pg9r*rq==!obnuk|4Gw|744m0I?kwssJ!=!kfdpiOR7y;xjU# zRf7*44K4}R7+3kz-&^6$O@X5Z%YQ(t06|FoL-Q9P*y3WsHpgyZ3s}_i?U!(FGjqo@{@mi9TYmseaT!PEtHGiG0000wFdf delta 899 zcmV-}1AP3m2DJx}7%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dkuocPmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdoFc^kS z9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~=`BAl< zKy0JrDpl&#Z$NsS_O< zvY2p=tJ!N-u-CHn0E5MZZZ%^gKxatwh9--lX19`o5nwPh8k!8O5gT?Z7+4K`S4}1t zppttmVS@^`Vne{-r;KSnCR;R~4rsTOLBJTBfGUnuJYXwi*Y8QUoRfe}qjCm866*mv zUyROw+4U!Dc$H7@=lo{Z!U`jnXaYI|f6~+T#GeET_ZfBl%NdLknPA09&bxgU0tstr z0)qDf!0(ViRrWi6!4{(-AeSr9ijuBe9>tPzFMH5j07prJ6@iS42koDdi576G1O}A4 z@ZIITYfY)O+auiARFGS0$&ZdS&esWjfNrcemyK~Kze-5eL8Y;h68$)3(TUnCLlQz z5Op#mtfd5;U^2G$0lg5S&BGSCWFP_tTsUJ$dsmsj*^IW=ia^FvKnl-%?SBa|W8t2E z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&CvT zr}o+L-ECS7)Ev%hRX_x&0wTaw(AEPGHUc1Dw6Y|KQm3gNS!X;z6X5d;0k}j?2&Hx@ z%Q4(g2fQZMjzsuuyVV4?+waN^Ct?FDSeDlD;LGU|fd)F#r#BA2j2^2>0c;9k4E{+0 Z@Eb;YJjE3kV}t+z002ovPDHLkV1jDDjlci^ diff --git a/graphics/pokemon/gourgeist/small/overworld.png b/graphics/pokemon/gourgeist/small/overworld.png index f2184b2cfc5642092ba824963e6af6c2affac397..cbbd3cca8a83fec1c908fd653f561b8c8f6a58f4 100644 GIT binary patch delta 567 zcmV-70?7Tf2kQio7#auz0001UMu)cm0004VQb$4nuFf3k0000mkwPnf0000000000 z0OhIQ+5i9m5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV8)%}GQ-R9J=WSJ!gHAPh8G zs?Gm@Z$xp54~b03LuP{J%EOjh(aasku3fu!?b@|#*RH=&z#7hFj9DS9$w8zhoZ-cv zh|~x=VNnjUlLmBrIlwP}bl|L}p5g58W-U$#aFaEp6MP72!WnMip!H}QL1b7)q3SC^ z)(7XbgmXLu7vv7CYXph0u6M~R0jIcg3_Ho+dVdqVA5m8I2LeuO<%Bw3{1JRi82j_^ zIy3^@U@2C88Ddpm2}6BN7$dYrqTxNCji->0XC6l*l(Bv?x}H~mh^{Y$k-i7Kt`b6S zK*YPhwO1VbTVKwfPGH7kkneoF!c~1Eyz1|OM&0BvknrYjxWmf~{ZY@)n*jSbPP?85 zAF93+Ui3Xb&yc;ugBlecUCgxs)sGgizc`yYfy5 z;Q7r)kwed4wh5-UO+dL$vpz5AG5yE#9mWd0uK#!S21CIT5P4V?U$X!J002ovPDHLk FV1ix54G{nU delta 899 zcmV-}1AP4J1hof{7%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dkuocPmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdoFc^kS z9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~=`BAl< zKy0JrDpl&#Z$NsS_O< zvY2p=tJ!N-u-CHn0E5MZZZ%^gKxatwh9--lX19`o5nwPh8k!8O5gT?Z7+4K`S4}1t zppttmVS@^`Vne{-r;KSnCR;R~4rsTOLBJTBfGUnuJYXwi*Y8QUoRfe}qjCm866*mv zUyROw+4U!Dc$H7@=lo{Z!U`jnXaYI|f6~+T#GeET_ZfBl%NdLknPA09&bxgU0tstr z0)qDf!0(ViRrWi6!4{(-AeSr9ijuBe9>tPzFMH5j07prJ6@iS42koDdi576G1O}A4 z@ZIITYfY)O+auiARFGS0$&ZdS&esWjfNrcemyK~Kze-5eL8Y;h68$)3(TUnCLlQz z5Op#mtfd5;U^2G$0lg5S&BGSCWFP_tTsUJ$dsmsj*^IW=ia^FvKnl-%?SBa|W8t2E z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&CvT zr}o+L-ECS7)Ev%hRX_x&0wTaw(AEPGHUc1Dw6Y|KQm3gNS!X;z6X5d;0k}j?2&Hx@ z%Q4(g2fQZMjzsuuyVV4?+waN^Ct?FDSeDlD;LGU|fd)F#r#BA2j2^2>0c;9k4E{+0 Z@Eb;YJjE3kV}t+z002ovPDHLkV1g)ejrITl diff --git a/graphics/pokemon/gourgeist/super/overworld.png b/graphics/pokemon/gourgeist/super/overworld.png index f2184b2cfc5642092ba824963e6af6c2affac397..d9494d1971b33a9102b6e70d410f4b553fdbbbea 100644 GIT binary patch delta 1101 zcmV-T1hV_J2mJ_;7#auz0001UMu)cm0004VQb$4nuFf3k0000mkwPnf0000000000 z0OhIQ+5i9m5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV8+-$_J4R9J!0q^}vVZ(n(2Sf}D z!yT^$Rtg*bQ#v37#JS;rj<*6k!6k>kbAY%M+;J@sR)e%OA=vb84@(ob@Dcld|BVa$fwIMP=4kVa2R(J zIz3zRaMB1l)qq4~mfoCb*>8t4VTqac^3{u*aP8pj&Z z3C2+{B#zd6<-A9K$FPY&t$#rVb<)6uhfXlu=lK$p?ie>t0ioSZnxNcdVin9-A|=0Y z2^cp4PC7Yv7$+Uryb}yD-1q$y3_=-q{G(T*oTn2!3_+U4m@n(bHQ?%aYXPu1C&DuyX^7908+_%<02#b_IASE2(gAEZJaRiM*biIl z^+{_%Nh8VJs;X zUV_>{4H(W3lEY7flLq7h%Gltwfc_Z^WWf?(G>`=gpXH-RD<9N~r%`K|4Q6a`72pNd zUt6Gm=aUBhyZ|}fgSIl{XAZeP>x(tWaL^%xWC}KJ+^7LNKP$iM(8#AL*SAhS-)8?O z&j#0}b8a-~eB;ynJRo+yuL0%<6&62qf8iYB%7j`SLJ?Ty%VDpOY`z?me89Xvv(s-l zAN;h3wtv2pQ^4xwF6U2oSk``#&#!M+ub@RJZufHTvv`aBPw%&X$p44)k0Jj7b1yY* TP*-^~00000NkvXXu0mjfkB$lo delta 899 zcmV-}1AP4b2(<^07%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dkuocPmybC^00009a7bBm000id000id0mpBsWB>pI7fD1xR7l6|mNAdoFc^kS z9d+iIyWlLnDnl;D4P0+Px`PbYEtvd)qq!Y|_tF9Bn6A@ROzqTe70XH2rJ(~=`BAl< zKy0JrDpl&#Z$NsS_O< zvY2p=tJ!N-u-CHn0E5MZZZ%^gKxatwh9--lX19`o5nwPh8k!8O5gT?Z7+4K`S4}1t zppttmVS@^`Vne{-r;KSnCR;R~4rsTOLBJTBfGUnuJYXwi*Y8QUoRfe}qjCm866*mv zUyROw+4U!Dc$H7@=lo{Z!U`jnXaYI|f6~+T#GeET_ZfBl%NdLknPA09&bxgU0tstr z0)qDf!0(ViRrWi6!4{(-AeSr9ijuBe9>tPzFMH5j07prJ6@iS42koDdi576G1O}A4 z@ZIITYfY)O+auiARFGS0$&ZdS&esWjfNrcemyK~Kze-5eL8Y;h68$)3(TUnCLlQz z5Op#mtfd5;U^2G$0lg5S&BGSCWFP_tTsUJ$dsmsj*^IW=ia^FvKnl-%?SBa|W8t2E z2yttUbDySl81hl^le4#`M1CLmb~h-&*Rd8NENME`;zalK>b8@jb&CvT zr}o+L-ECS7)Ev%hRX_x&0wTaw(AEPGHUc1Dw6Y|KQm3gNS!X;z6X5d;0k}j?2&Hx@ z%Q4(g2fQZMjzsuuyVV4?+waN^Ct?FDSeDlD;LGU|fd)F#r#BA2j2^2>0c;9k4E{+0 Z@Eb;YJjE3kV}t+z002ovPDHLkV1jk9jtl?* diff --git a/graphics/pokemon/pumpkaboo/large/overworld.png b/graphics/pokemon/pumpkaboo/large/overworld.png index 67542d25d92002659ad86d6c57ae3f75a2f79be5..5c9d3e7f96142b488968e14ea4b906527881df83 100644 GIT binary patch delta 547 zcmV+;0^I$I1l0tP7#auz0001UMu)cm0004VQb$4nuFf3k0000mktHa90000000000 z00000%d|(}0005gNkl?t-9Ed$0ki$P^DBl7+(k` zNlKSpcG+c@U3S@DF(Nv}PX=K2qencEsCqsTPpm4gLYH$K-Om8}#PNwZc8C;uoJGY` z7;y+BFUg2QAO#6{oNIJ{XL-PpA(N*s;MjuQA_W`*$tgg@twMf}Mf_|CWJfa2Fye#~ zr}3N!Ikhd0a%3l_ZJD*J zNSUGJYLohR4Xk6d3kC>&~wa lKN@2f#~}{?1MB~teF4Ot65!udV^IJA002ovPDHLkV1m6}_8tHL delta 472 zcmV;}0Vn>|1d0TZ7!3pi0002CwraKj001PBGAMtULdp~X00E&%L_t(|obA=UYQr!P z0N}HxLKZ1Dfo_iDA<)T|Ucl0|eSt0+3t7771)9xd>QbEa39^L@g^-u4Tted??n!kB|*AQaNT42Um^d4^;0^=-aNYP2g!sP7*I`#!4 z%Nc*tqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fhk(6A6UJ1|M*aZb;jqp$);JZplPap124# z7C*#2vFYgyKETl%Cf4?6GTAG z{RQKLL$zF_@^TQ4gfy;Pe*v2SAQMNswPK z!+%t8AfVeBs6WZm#W5tJ_3gBSMTZr5TpU;5(D?WN|Jsx}-vlOTWGse8ZU<*&G_kUvq- zUu25LgPEF#3ndEYDy#@R5`V@);lS#G1Ho)NO}TddDlRv8kn(SiQ0tt(4dume^)Jhu zuR6?ljB)SldD}8O<{LlJ{P%SIZ56xgk6YUvP5NF5?B_XG@Y;W0X!~0=Zi~5Zj)h;? z+^G0(W&Y>O503R6u5ZXL|0KEbW&C2VCH}C@H(~+^R7r?2&I3o0HzL)Je;ecYEr& zJk5AC;k9uf%Y>r$G07$C_k5pWcg(xL+ulyLy`wpJV?*Artbzopr0LG5eE&u=k delta 472 zcmV;}0Vn=|1d0TZ7!3pi0002CwraKj001PBGAMtULdp~X00E&%L_t(|obA=UYQr!P z0N}HxLKZ1Dfo_iDA<)T|Ucl0|eSt0+3t7771)9xd>QbEa39^L@g^-u4Tted??n!kB|*AQaNT42Um^d4^;0^=-aNYP2g!sP7*I`#!4 z%Nc*tqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fhk(6A6UJ1|M*aZb;jqp$);JZplPap124# z7C*#2vFYgyKETl%Cf4?6GTAG z{RQKLL$z)UB(g$^rlv^-UJJN~`?e$(?EDOtvEeQtX5$vN;hK`VjOFV>H0=7O~oHz%|Ue*d$|K<&{QuKNtd-`+^y`8!deyFVdQ I&MBb@03DaB@Bjb+ delta 472 zcmV;}0Vn>g1BwKY7!3pi0002CwraKj001PBGAMtULdp~X00E&%L_t(|obA=UYQr!P z0N}HxLKZ1Dfo_iDA<)T|Ucl0|eSt0+3t7771)9xd>QbEa39^L@g^-u4Tted??n!kB|*AQaNT42Um^d4^;0^=-aNYP2g!sP7*I`#!4 z%Nc*tqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fhk(6A6UJ1|M*aZb;jqp$);JZplPap124# z7C*#2vFYgyKETl%Cf4?6GTAG z{RQKLL$z0u7Bc|tFpweHEQk&upB?TW|(ZVQC7LV=!jpq z;}Gz!cNsixxK5DgpD}W8yuRJ-q*~;*PVdg^1bU8wcrMYy9z?W;5{HNoLUAKY_-MZ1 z=K|g4=of;{M-)6Wgw9Xk)I*Fu|6=kncI_|nn0fq$gPKQwLrsrs@NSPo1o-)gQ;XLa z`wn8uZ+A)zh?!Fv)UWxieoFp0Vt`@B@lA>6;l`nh0|yD)58*iOf=A5<&nhNfe4Jp# z2lZ3%Imt0rs^b0pl`cXoWh{7HT&h1ZfCTya2@CqA$QbEa39^L@g^-u4Tted??n!kB|*AQaNT42Um^d4^;0^=-aNYP2g!sP7*I`#!4 z%Nc*tqO(BTBC-K6_A8EK&LD;^<{a5ja)z{BuV)aJb()7c=U`$3$yug3XGkZy^-etx z-Pp1=tOJaS=Emt7Qio_cBO1;TBI+UKK&s3qLUroOr9KsOji$FP3imz1L@{B^47v~r z*Sq@3PdFdFj)g(IN1rF!Y!Fhk(6A6UJ1|M*aZb;jqp$);JZplPap124# z7C*#2vFYgyKETl%Cf4?6GTAG z{RQKLL$z Date: Mon, 16 Sep 2024 12:12:34 -0300 Subject: [PATCH 16/34] Version 1.9.2 (#5357) * Version 1.9.2 * Apply suggestions from code review Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.com> * Updated to latest master * Updated to latest master * Fix last PR * Corrected order + Pumpkaboo/Gourgeist credits --------- Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.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 | 4 +- docs/SUMMARY.md | 2 + docs/changelogs/1.9.x/1.9.0.md | 2 +- docs/changelogs/1.9.x/1.9.1.md | 4 +- docs/changelogs/1.9.x/1.9.2.md | 202 ++++++++++++++++++ docs/changelogs/template.md | 11 +- include/constants/expansion.h | 4 +- 11 files changed, 228 insertions(+), 11 deletions(-) create mode 100644 docs/changelogs/1.9.x/1.9.2.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index edebc1bbf0..9ffdc70fba 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.1 (Latest release) + - 1.9.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index dd3024230b..ce50b0bffd 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.1 (Latest release) + - 1.9.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 29960c267b..c78093d60e 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.1 (Latest release) + - 1.9.2 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.1 - 1.9.0 - 1.8.6 - 1.8.5 diff --git a/CHANGELOG.md b/CHANGELOG.md index fb2f38af1d..bb9fec3e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pokeemerald-Expansion Changelogs ## 1.9.x +- **[Version 1.9.2](docs/changelogs/1.9.x/1.9.2.md) - 🧹 Bugfix Release** - **[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** diff --git a/README.md b/README.md index f09f5a7d90..37ea8336b7 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.1 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.9.2 https://github.com/rh-hideout/pokeemerald-expansion/ ``` ## What features are included? @@ -178,7 +178,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple - Check your current version. - You can check in the debug menu's `Utilities -> Expansion Version` option. - If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](CHANGELOG.md) to determine your version based on the features available on your repository. -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.8.4, use `git pull RHH expansion/1.8.4`). +- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.2, use `git pull RHH expansion/1.9.2`). - ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on) - Alternatively, you can update to unreleased versions of the expansion. - ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 603fa225db..faeb069783 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,6 +19,8 @@ - [How to use the Testing System](./how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.9.x]() + - [Version 1.9.2](changelogs/1.9.x/1.9.2.md) + - [Version 1.9.1](changelogs/1.9.x/1.9.1.md) - [Version 1.9.0](changelogs/1.9.x/1.9.0.md) - [1.8.x]() - [Version 1.8.6](changelogs/1.8.x/1.8.6.md) diff --git a/docs/changelogs/1.9.x/1.9.0.md b/docs/changelogs/1.9.x/1.9.0.md index 0d39f109ed..b0815c6e2a 100644 --- a/docs/changelogs/1.9.x/1.9.0.md +++ b/docs/changelogs/1.9.x/1.9.0.md @@ -551,6 +551,6 @@ * @rayrobdod made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4727 * @innocenthedgehog made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4988 -**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.5...expansion/1.9.0 +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.6...expansion/1.9.0 diff --git a/docs/changelogs/1.9.x/1.9.1.md b/docs/changelogs/1.9.x/1.9.1.md index 8393727c2a..dfe8946bd9 100644 --- a/docs/changelogs/1.9.x/1.9.1.md +++ b/docs/changelogs/1.9.x/1.9.1.md @@ -120,14 +120,14 @@ * 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 +### pret's base pokeemerald * 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 +### merrp/aarant's 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) diff --git a/docs/changelogs/1.9.x/1.9.2.md b/docs/changelogs/1.9.x/1.9.2.md new file mode 100644 index 0000000000..4d95fc95f9 --- /dev/null +++ b/docs/changelogs/1.9.x/1.9.2.md @@ -0,0 +1,202 @@ +# Version 1.9.2 + +```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.2`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Remove unused `BattleScript_WindPowerActivatesEnd2` in [#5257](https://github.com/rh-hideout/pokeemerald-expansion/pull/5257) +* Refactored in-battle disobedience to fix bug in [#5245](https://github.com/rh-hideout/pokeemerald-expansion/pull/5245) + +## 💥 *Hardlock/Softlock/Crash/Compiling fixes* 💥 +* Fixed hardlock when Hyperspace Fury is used by Hoopa Unbound by @AlexOn1ine in [#5237](https://github.com/rh-hideout/pokeemerald-expansion/pull/5237) +* Fixed compile error when `OW_POKEMON_OBJECT_EVENTS` is `TRUE` but `P_HISUIAN_FORMS` is `FALSE` around Basculin by @hjk321 in [#5256](https://github.com/rh-hideout/pokeemerald-expansion/pull/5256) +* Fixed hardlock when the AI cannot choose moves due to its opponent having Wonder Guard by @Pawkkie and Wiz in [#5317](https://github.com/rh-hideout/pokeemerald-expansion/pull/5317) +* Fixed multiple Pledge move hardlocks + * Fixed potential hardlock when attempting to use Pledge moves on the same turn that the user would wake up by @PhallenTree in [#5330](https://github.com/rh-hideout/pokeemerald-expansion/pull/5330) + * Fixed hardlock when the opponent's combo doesn't happen when cancelled by sleep by @hedara90 and @PhallenTree in [#5339](https://github.com/rh-hideout/pokeemerald-expansion/pull/5339) + * Fixes hardlock when the opponent's combo doesn't happen when cancelled by freeze by @PhallenTree in [#5340](https://github.com/rh-hideout/pokeemerald-expansion/pull/5340) + * Fixed hardlock when the opponent's combo doesn't happen when cancelled by Powder by @hedara90 in [#5341](https://github.com/rh-hideout/pokeemerald-expansion/pull/5341) + +## 🧬 General 🧬 +### Fixed +* Fixed loading into the wrong version of a map after saving in areas with multiple layouts by @hedara90 in [#5347](https://github.com/rh-hideout/pokeemerald-expansion/pull/5347) + +## 🐉 Pokémon 🐉 +### Added +* Added `OVERWORLD_SET_ANIM` macro to allow using custom animation tables for Overworld Pokémon by @hedara90 in [#5309](https://github.com/rh-hideout/pokeemerald-expansion/pull/5309) + * Added asymetrical Farfetch'd sprites using a previously unused table from merrp's followers branch. +* Added unique sprites for overworld Pumpkaboo and Gourgeist forms by @hedara90 in [#5390](https://github.com/rh-hideout/pokeemerald-expansion/pull/5390) +* Added missing Sirfetch'd competitive alias (`SPECIES_SIRFETCH_D`) by @cawtds in [#5283](https://github.com/rh-hideout/pokeemerald-expansion/pull/5283) +* Added Paldean Wooper and Clodsire overworld sprites by @Cafeei in [#5277](https://github.com/rh-hideout/pokeemerald-expansion/pull/5277) +* Added missing Gen 9 Overworld sprites by @Liamjd14 in [#5304](https://github.com/rh-hideout/pokeemerald-expansion/pull/5304) + * Original sprites by Darkus_Shadow, Princess-Phoenix, shaderr31, Molfang62, CarmaNekko, EduarPokeN, Larryturbo, TyranitarDark and Anarlaurendil + * Sources: + * Normal: https://www.deviantart.com/darkusshadow/art/Gen-9-Paldea-Pokemon-Overworld-Sprites-967776690 + * Shiny: https://www.deviantart.com/darkusshadow/art/SHINY-Gen-9-Paldea-Pokemon-Overworld-Sprites-967779547 +* Added missing overworld sprites by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * **New Sprites:** + * Oricorio Pom Pom/Pa'U/Sensu, Zygarde 10%/Complete and Original Color Magearna + * Credits to: Princess-Phoenix, Larryturbo, Kidkatt, Zender1752 and SageDeoxys. + * Black/White Kyurem + * Credits to: Larryturbo. + * Shaymin Sky and Therian Tornadus/Thundurus/Landorus + * Credits to: @Liamjd14 + * **Using their base form's sprites** + * Totem Raticate/Mimikyu/Marowak and Partner Pikachu/Eevee +* Added Added asymmetrical overworld sprites by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * Slowbro (Galarian), Tinkatink, Tinkatuff, Tinkaton and Scovillain + * Enabled in `gSpeciesInfo` by @Liamjd14 in [#5385](https://github.com/rh-hideout/pokeemerald-expansion/pull/5385) +### Changed +* Improved Garganacl and Naclstack battle sprites by using the ones from @CyanSMP64's repo by @kittenchilly in [#5142](https://github.com/rh-hideout/pokeemerald-expansion/pull/5142) +* Improved both shiny Indeedee by @Cafeei in [#5285](https://github.com/rh-hideout/pokeemerald-expansion/pull/5285) +* Shiny Combusken now uses its Gen8+ palette by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) +### Fixed +* Reenabled unused female Indeedee overworld sprite by @Cafeei in [#5285](https://github.com/rh-hideout/pokeemerald-expansion/pull/5285) +* Fixed G-Max Corviknight and Centiskorch's expanded names by @PhallenTree in [#5296](https://github.com/rh-hideout/pokeemerald-expansion/pull/5296) +* Fixed G-Max Cinderace back sprite by @hedara90 in [#5295](https://github.com/rh-hideout/pokeemerald-expansion/pull/5295) +* Fixed Shiny Mothim' by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) +* Fixed multiple battle sprite issues by @kittenchilly in [#5142](https://github.com/rh-hideout/pokeemerald-expansion/pull/5142) + * **Sprite issues:** + * Bombirdier, Mega Absol/Aerodactyl/Latias/Latios/Salamence, Orthworm and Veluza. + * **Shiny issues:** + * Bombirdier, Kilowattrel, Landorus, Magearna, Mega Diancie/Medicham, Galarian Ponyta, Shroodle, Spidops and Wattrel. +* Fixed multiple overworld Pokémon sprites - Part 1 by @Cafeei in [#5241](https://github.com/rh-hideout/pokeemerald-expansion/pull/5241) + * **"Blinking pixels":** + * Dwebble, Krookodile, Servine, Throh and Vulpix. + * **Shiny Palettes** + * Crustle, Excadrill, Lillipup, Serperior, Servine, Sigilyph, Swoobat, Tranquil and Venipede. + * **Misc fixes:** + * Archen, Basculin, Blitzle, Crustle, Escavalier, Krokorok, Krookodile, Sawsbuck, secondary, Serperior, Snivy, Throh, Woobat, Zebstrika +* Fixed multiple overworld Pokémon sprites - Part 2 by @Cafeei in [#5333](https://github.com/rh-hideout/pokeemerald-expansion/pull/5333) + * **Palette Fixes:** + * Shiny Riolu/Snover, Oshawott, Kabutops, Shieldon, Kingler and Groudon. + * **Fixed "Blinking pixels":** + * Abomasnow, Aggron, Alakazam, Ariados, Articuno, Azumarill, Barboach, Bayleef, Bibarel, Blastoise, Celebi, Charmeleon, Cherrim, Chinchou, Cloyster, Corphish, Corsola, Crawdaunt, Cubone, Dewott, Doduo, Dusknoir, Electabuzz, Espeon, Exeggcute, Farfetch'd, Feraligatr, Flaafy, Flareon, Floatzel, Furret, Gastly, Girafarig, Giratina, Gligar, Gloom, Golbat, Grumpig, Hariyama, Heatran (just reduced), Hoppip, Jolteon, Jumpluff, Kricketot, Larvitar, Leafeon, Lileep, Lumineon, Luxio, Luxray, Machamp, Magneton, Mantine, Mantyke, Marowak, Meowth, Mesprit, Mew, Mewtwo, Mime Jr, Moltres, Numel, Oshawott, Phione, Pinsir, Politoed, Porygon-Z, Probopass, Quilava, Qwilfish, Rampardos, Rapidash, Regirock, Sceptile, Scizor, Seel, Shieldon, Shiftry, Slowking, Smoochum, Sneasel, Spheal, Steelix, Sudowoodo, Suicune, Swellow, Swinub, Tentacruel, Togekiss, Togepi, Vaporeon, Vibrava, Wartortle, Wooper, Yanma, Yanma, Yanmega, Zangoose, Zapdos, Zubat + * **Misc. Sprite Fixes**: Dewott, Misdreavus, Oshawott, Torkoal and Victini. +* Overworld sprite fixes by @Liamjd14 (with help from @hedara90 to solve conflicts) in [#5334](https://github.com/rh-hideout/pokeemerald-expansion/pull/5334) + * **Palette Fixes**: Shieldon. + * **Misc. Sprite Fixes** Torkoal. + * **"Blinking pixels":** + * Ambipom, Armaldo, Crawdaunt, Crobat, Donphan, Flaaffy, Flygon, Grovyle, Hoppip, Igglybuff, Illumise, Jumpluff, Ledian, Ledyba, Mamoswine, Mantine, Marshtomp, Meganium, Mightyena, Miltank, Numel, Prinplup, Raikou, Roserade, Skarmory, Skiploom, Spinarak, Staraptor, Stunky, Torkoal, Wooper, Xatu, Yanma +* Overworld Pokémon sprite changes by @Liamjd14 in [#5336](https://github.com/rh-hideout/pokeemerald-expansion/pull/5336) + * **Fixed "blinking pixels":** + * Alolan Graveler/Golem/Alolan/Ninetales + * Dawn Wings Necrozma + * Hisuian Growlithe/Arcanine + * Winter Sawsbuck + * **Added missing Shiny Palettes** + * Calyrex Ice/Shadow Rider, Origin Dialga/Palkia, White-Striped Basculin, Therian Enamorus and Low-Key Toxtricity. + * **Removed Gigantamax Low-Key Toxtricity using base Low-Key follower sprites.** + * **Fixed Shiny palettes** + * Alolan Marowak/Raichu, Eternal Flower Floette, Flabébé (All), Galarian Ponyta/Rapidash + * Typhlosion-Hisui follower shiny stomach color wrong - done + * **Other sprite/palette fixes** + * Alolan Exeggutor/Marowak/Persian/Raichu/Sandshrew, Hisuian Sligoo/Goodra and Winter Sawsbuck. +## ⚔️ Battle General ⚔️ ## +### Changed +* Updated Damage Category icons to match Gen6+ colors by @kittenchilly in [#5080](https://github.com/rh-hideout/pokeemerald-expansion/pull/5080) +### Fixed +* Fixed Slateport Battle Tent/Battle Factory issues by @SarnPoke in [#5281](https://github.com/rh-hideout/pokeemerald-expansion/pull/5281) + * Choosing the "SWAP" option no longer shows invalid Pokémon ("??????????"). + * Reloading after choosing "REST" no longer resets the player's challenge party to invalid Pokémon ("??????????"). +* Fixed Starting Status happening Wild Battles from a previous Trainer Battle by @PhallenTree in [#5248](https://github.com/rh-hideout/pokeemerald-expansion/pull/5248) +* Fixed bugged behavior caused by Z-Moves and disobedience by @hedara90 in [#5245](https://github.com/rh-hideout/pokeemerald-expansion/pull/5245) +* Fixed Entry Hazards targeting wrong side of the field if the opponent fainted by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) +* Fixed being able to use multiple of the same Gimmick in Double Battles by @AgustinGDLV in [#5235](https://github.com/rh-hideout/pokeemerald-expansion/pull/5235) +* Fixed Terastallization not granting immunity to Tar Shot by @AlexOn1ine in [#5302](https://github.com/rh-hideout/pokeemerald-expansion/pull/5302) +* Fixed `Cmd_trainerslidein/out` using the incorrect function by @ghoulslash in [#5326](https://github.com/rh-hideout/pokeemerald-expansion/pull/5326) + * Cleanup by @hedara90 in [#5344](https://github.com/rh-hideout/pokeemerald-expansion/pull/5344) + +## 🤹 Moves 🤹 +### Added +* Added Charge's Gen 9 behavior via `B_CHARGE` config by @AlexOn1ine in [#5274](https://github.com/rh-hideout/pokeemerald-expansion/pull/5274) +* Added Powder's Gen 7+ behavior of not causing damage when under Heavy Rain via `B_POWDER_RAIN` by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) +### Fixed +* Fixed move descriptions missing periods (Decorate, Collision Course, Electro Drift) by @Pawkkie and Kasen in [#5221](https://github.com/rh-hideout/pokeemerald-expansion/pull/5221) +* Fixed Confide not being blocked by Crafty Shield interaction by @hedara90 in [#5202](https://github.com/rh-hideout/pokeemerald-expansion/pull/5202) +* Fixed message for switch out moves by @kittenchilly in [#5258](https://github.com/rh-hideout/pokeemerald-expansion/pull/5258) +* Fixed Ice Fang's descriptions using the opposite of what they're supposed to do based on `B_USE_FROSTBITE` by @laserXdolphin in [#5273](https://github.com/rh-hideout/pokeemerald-expansion/pull/5273) +* Fixes to Instruct by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) + * Fixed Instruct bypassing AtkCanceler checks (Instruct allowed the target to act while asleep, flinched, etc.) and its interaction with First Turn Only moves (Fake Out, First Impression, Mat Block). + * Fixed Instruct's animation using the attacker and target of the called move. +* Fixed Scale Shot's effect not activating if the opponent fainted before all hits finished by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292) +* Fixed Round not preserving turn order for non-Round users if there's a switch out at the beginning of the turn by @AlexOn1ine in [#5292](https://github.com/rh-hideout/pokeemerald-expansion/pull/5292) +* Fixed Max Moves ignoring absorbing abilities (+ test) by @PhallenTree in [#5296](https://github.com/rh-hideout/pokeemerald-expansion/pull/5296) +* Fixed attack string for Max Moves not being printed if it's blocked by Max Guard by @hedara90 in [#5312](https://github.com/rh-hideout/pokeemerald-expansion/pull/5312) +* Fixed some Pledge move combo issues by @PhallenTree in [#5330](https://github.com/rh-hideout/pokeemerald-expansion/pull/5330) + * Fixed Pledge move combos attempting to be executed multiple times in a turn, causing mons to decrement sleep timer multiple times during the turn or causing infinite loops. +* Fixed potential issue with custom non-sound moves that use `EFFECT_ATTACK_UP_USER_ALLY` or `EFFECT_PERISH_SONG` being blocked by Soundproof anyway by @AlexOn1ine in [#5301](https://github.com/rh-hideout/pokeemerald-expansion/pull/5301) +* Fixed Pledge combinations not being absorbed by absorption Abilities (Sap Sipper, Storm Drain, etc.) by @hedara90 in [#5364](https://github.com/rh-hideout/pokeemerald-expansion/pull/5364) +* Fixed Toxic Thread decreasing speed by 2 stages instead of 1 by @AsparagusEduardo in [#5369](https://github.com/rh-hideout/pokeemerald-expansion/pull/5369) +* Fixed Destiny Bond not working if the user was fainted by a multi-Hit move's non-first hit by @AlexOn1ine in [#5377](https://github.com/rh-hideout/pokeemerald-expansion/pull/5377) +* Fixed Powder interactions by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) + * Fixed Magic Guard not protecting against Powder's secondary damage when using a Fire-type move. + * Fixed Fire/Water Pledge combination being cancelled by Powder. + * Fixed Fire Z-Moves not playing their animations and not granting their secondary effects when the user is under Powder's effect +* Fixed After You/Shell Trap not updating battlers' actions correctly by @PhallenTree in [#5384](https://github.com/rh-hideout/pokeemerald-expansion/pull/5384) + +## 🎭 Abilities 🎭 +### Fixed +* Fixed weather abilities not activating when Cloud Nine user leaves the field by @AlexOn1ine in [#5209](https://github.com/rh-hideout/pokeemerald-expansion/pull/5209) +* Fixed missing `break` for Poison Puppeteer's code by @u8-Salem in [#5243](https://github.com/rh-hideout/pokeemerald-expansion/pull/5243) +* Fixed Pokémon with Purifying Salt being poisoned by Toxic Spikes by @AlexOn1ine in [#5252](https://github.com/rh-hideout/pokeemerald-expansion/pull/5252) +* Fixed Parental Bond not affecting Snore by @hedara90 in [#5264](https://github.com/rh-hideout/pokeemerald-expansion/pull/5264) +* Fixed Tera Shift's description by @AsparagusEduardo in [#5351](https://github.com/rh-hideout/pokeemerald-expansion/pull/5351) + +## 🧶 Items 🧶 +### Fixed +* Fixed berries missing their timing after passive damage by @AlexOn1ine in [#5300](https://github.com/rh-hideout/pokeemerald-expansion/pull/5300) +* Fixed Micle Berry not increasing accuracy on the next turn by @AlexOn1ine in [#5358](https://github.com/rh-hideout/pokeemerald-expansion/pull/5358) + +## 🤖 Battle AI 🤖 +### Changed +* AI is encouraged to use "always crit" moves on partner with Anger Point by @SarnPoke in [#5244](https://github.com/rh-hideout/pokeemerald-expansion/pull/5244) +### Fixed +* Fixed AI not seeing the power of Max Moves by @AlexOn1ine in [#5299](https://github.com/rh-hideout/pokeemerald-expansion/pull/5299) +* Fixed minor wrong order in `AI_CalcDamage` that made Nature Power not be considered for Z-Moves by @AlexOn1ine in [#5155](https://github.com/rh-hideout/pokeemerald-expansion/pull/5155) +* Fixed AI not considering Tera Blast/Tera Storm by @AlexOn1ine in [#5155](https://github.com/rh-hideout/pokeemerald-expansion/pull/5155) +* Fixed `AI_IsMoveEffectInPlus` reading the incorrect stat for secondary effects that reduce stats by 2 stages by @ghoulslash and @Pawkkie in [#5366](https://github.com/rh-hideout/pokeemerald-expansion/pull/5366) + +## 🧹 Other Cleanup 🧹 +### Changed +* Remove unused `BattleScript_WindPowerActivatesEnd2` signature by @u8-Salem in [#5257](https://github.com/rh-hideout/pokeemerald-expansion/pull/5257) +* Replaced all usages of tabs in C files with spaces by @hedara90 in [#5261](https://github.com/rh-hideout/pokeemerald-expansion/pull/5261) +* Fixed missing `break`s in two `ENDTURN` cases by @ghoulslash in [#5350](https://github.com/rh-hideout/pokeemerald-expansion/pull/5350) +* `ShouldSwitchIfWonderGuard` cleanup by @Pawkkie in [#5383](https://github.com/rh-hideout/pokeemerald-expansion/pull/5383) + +## 🧪 Test Runner 🧪 +### Added +* Added missing Adaptability, Aerilate, Aftermath tests by @kittenchilly in [#5242](https://github.com/rh-hideout/pokeemerald-expansion/pull/5242) +* Added missing Disguise tests by @hedara90 in [#5249](https://github.com/rh-hideout/pokeemerald-expansion/pull/5249) +* Added some missing Instruct tests by @PhallenTree in [#5262](https://github.com/rh-hideout/pokeemerald-expansion/pull/5262) +* Added missing Powder tests by @PhallenTree in [#5370](https://github.com/rh-hideout/pokeemerald-expansion/pull/5370) +* Added `ShouldSwitchIfWonderGuard` AI tests by @Pawkkie in [#5383](https://github.com/rh-hideout/pokeemerald-expansion/pull/5383) +### Changed +* Moved `ASSUME`s to inside `GIVEN` blocks to prevent them from being added correctly to the totals in the test summary by @AsparagusEduardo in [#5308](https://github.com/rh-hideout/pokeemerald-expansion/pull/5308) + +## 📚 Documentation 📚 +### Fixed +* Fixed test system documentation saying that `make check TESTS="Spikes"` could be done with single quotes instead of double quotes by @AsparagusEduardo in [#5266](https://github.com/rh-hideout/pokeemerald-expansion/pull/5266) + +## 📦 Branch Synchronisation 📦 +### pret's base pokeemerald +* N/A +### merrp/aarant's followers +* Merrp merge (September 9th) by @AsparagusEduardo in [#5359](https://github.com/rh-hideout/pokeemerald-expansion/pull/5359) + * aarant#40 (discarded, as it was already part of the expansion) + * New features: + * [Static OW pokemon now bob while walking in place](https://github.com/rh-hideout/pokeemerald-expansion/commit/839cf2e79012e0fc9159af5ab9e6a497e86bbfa4) + * Toggled by `OW_FOLLOWERS_BOBBING`. + * [Added `OW_MON_WANDER_WALK` config option](https://github.com/rh-hideout/pokeemerald-expansion/commit/42d9f24c8472a67d742d9d9da106480c84514336) + * If true, OW pokemon with `MOVEMENT_TYPE_WANDER*` will walk-in-place in between steps. + +## New Contributors +* @laserXdolphin made their first contribution in [#5273](https://github.com/rh-hideout/pokeemerald-expansion/pull/5273) +* @Liamjd14 made their first contribution in [#5304](https://github.com/rh-hideout/pokeemerald-expansion/pull/5304) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.1...expansion/1.9.2 + diff --git a/docs/changelogs/template.md b/docs/changelogs/template.md index a40afebad3..fe4191f589 100644 --- a/docs/changelogs/template.md +++ b/docs/changelogs/template.md @@ -10,7 +10,7 @@ 📜 = Uses a migration script. * N/A -## 💥 *Softlock/Crash fixes* 💥 +## 💥 *Hardlock/Softlock/Crash/Compiling fixes* 💥 * N/A ## 🧬 General 🧬 @@ -122,6 +122,14 @@ ### Fixed * N/A +## 📚 Documentation 📚 +### Added +* N/A +### Changed +* N/A +### Fixed +* N/A + ## 📦 Branch Synchronisation 📦 ### pret's base pokeemerald * N/A @@ -135,3 +143,4 @@ **Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.Y.Z...expansion/1.Y.Z + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index caf7e4ddab..338c41a848 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.1 +// 1.9.2 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 9 #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 FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From 6116b8b04e4152f4e794fd54907c1a9979db375a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 16 Sep 2024 11:57:41 -0300 Subject: [PATCH 17/34] Start 1.9.3 cycle --- include/constants/expansion.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 338c41a848..8a86282619 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.2 +// Last version: 1.9.2 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 9 -#define EXPANSION_VERSION_PATCH 2 +#define EXPANSION_VERSION_PATCH 3 // 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 95dac7c4acb7fea7b3d4af866194236eee7d4926 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:58:43 +0200 Subject: [PATCH 18/34] Remove potential uninitialized behavior (#5393) `MAX_BATTLERS_COUNT` makes more sense to use here because we iterate over max battlers in the first place. --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 04f3c966bb..698b8db4b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8935,7 +8935,7 @@ static bool32 ChangeOrderTargetAfterAttacker(void) || GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) return FALSE; - for (i = 0; i < gBattlersCount; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { data[i] = gBattlerByTurnOrder[i]; actionsData[i] = gActionsByTurnOrder[i]; From 27db57f854856ccb75cf6b661e78d45f1e4e17c5 Mon Sep 17 00:00:00 2001 From: RavePossum <145081120+ravepossum@users.noreply.github.com> Date: Wed, 18 Sep 2024 10:57:13 -0400 Subject: [PATCH 19/34] fallback on default BW popup theme to reduce potential for error (#5392) --- src/map_name_popup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 5cc1f3cfd5..500d45e866 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -625,7 +625,7 @@ static void LoadMapNamePopUpWindowBg(void) switch (popUpThemeId) { // add additional gen 5-style pop-up themes as cases here - case MAPPOPUP_THEME_BW_DEFAULT: + default: // MAPPOPUP_THEME_BW_DEFAULT if (OW_POPUP_BW_COLOR == OW_POPUP_BW_COLOR_WHITE) LoadPalette(sMapPopUpTilesPalette_BW_White, BG_PLTT_ID(14), sizeof(sMapPopUpTilesPalette_BW_White)); else From 6ef36837e94edcde20a5ddf78ab0c89e77df106a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:58:49 +0200 Subject: [PATCH 20/34] Fixed corruption of the next turn used move caused by Scale Shot (#5397) --- data/battle_scripts_1.s | 40 +++-------------------------- include/battle_scripts.h | 1 + src/battle_script_commands.c | 10 +++----- test/battle/move_effect/multi_hit.c | 40 +++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 43 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0040c7e804..06b82f43b7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3279,51 +3279,17 @@ BattleScript_RoarBlockedByDynamax: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_MultiHitLoop:: - jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd - jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings - jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoMultiHit - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings -BattleScript_DoMultiHit:: - movevaluescleanup - copyhword sMOVE_EFFECT, sMULTIHIT_EFFECT - critcalc - damagecalc - jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - multihitresultmessage - flushtextbox - addbyte sMULTIHIT_STRING + 4, 1 - moveendto MOVEEND_NEXT_TARGET - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_MultiHitPrintStrings - decrementmultihit BattleScript_MultiHitLoop - goto BattleScript_MultiHitPrintStrings -BattleScript_MultiHitNoMoreHits:: - pause B_WAIT_TIME_SHORT BattleScript_MultiHitPrintStrings:: resultmessage waitmessage B_WAIT_TIME_LONG - jumpifmovehadnoeffect BattleScript_MultiHitEnd copyarray gBattleTextBuff1, sMULTIHIT_STRING, 6 printstring STRINGID_HITXTIMES waitmessage B_WAIT_TIME_LONG return -BattleScript_MultiHitEnd:: - setadditionaleffects - tryfaintmon BS_TARGET - moveendcase MOVEEND_SYNCHRONIZE_TARGET - moveendfrom MOVEEND_STATUS_IMMUNITY_ABILITIES - end +BattleScript_ScaleShot:: + call BattleScript_MultiHitPrintStrings + goto BattleScript_DefDownSpeedUp BattleScript_EffectConversion:: attackcanceler diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 893ab42a5e..e98790764d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -460,6 +460,7 @@ extern const u8 BattleScript_DefDownSpeedUp[]; extern const u8 BattleScript_AffectionBasedStatusHeal[]; extern const u8 BattleScript_AffectionBasedEndurance[]; extern const u8 BattleScript_SymbiosisActivates[]; +extern const u8 BattleScript_ScaleShot[]; extern const u8 BattleScript_MultiHitPrintStrings[]; extern const u8 BattleScript_RemoveFireType[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 698b8db4b4..1e4b10e928 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6030,13 +6030,11 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (gMultiHitCounter == 0) { - if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp; - } BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) + gBattlescriptCurrInstr = BattleScript_ScaleShot; + else + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; effect = TRUE; } else diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index fca9da8150..052226d1c8 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -160,6 +160,46 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final } } +SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move correctly") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].type == TYPE_DRAGON); + ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFAIRY) { HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCALE_SHOT); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player); + MESSAGE("It doesn't affect Foe Clefairy…"); + } +} + +DOUBLE_BATTLE_TEST("Scale Shot does not corrupt the next turn move used") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_SCALE_SHOT, target: opponentRight); SWITCH(playerLeft, 2); SEND_OUT(opponentRight, 2); } + TURN { MOVE(playerRight, MOVE_BULLDOZE); MOVE(playerLeft, MOVE_CELEBRATE); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(opponentLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, playerRight); + HP_BAR(opponentRight); + MESSAGE("Hit 1 time(s)!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLDOZE, playerRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} + SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur at the end of the turn") { GIVEN { From ac2b41ae71de8539217d046f15b873101b818741 Mon Sep 17 00:00:00 2001 From: nescioquid <34481132+nescioquid@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:03:36 -0400 Subject: [PATCH 21/34] Typo fixes and Growth move description change (#5398) * changes Growth's move description to account for Gen 5+ behavior * completes B_DIVE_BALL_MODIFIER comment * fixes typos and incongruent spacing in various files * Update src/data/moves_info.h Co-authored-by: Bassoonian --------- Co-authored-by: Bassoonian --- include/config/battle.h | 2 +- include/config/overworld.h | 4 ++-- migration_scripts/README.md | 2 +- src/data/moves_info.h | 5 +++++ src/party_menu.c | 2 +- src/pokemon.c | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 501c4162ee..402b5db6cf 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -165,7 +165,7 @@ #define B_RESTORE_HELD_BATTLE_ITEMS GEN_LATEST // In Gen9, all non-berry items are restored after battle. #define B_SOUL_DEW_BOOST GEN_LATEST // In Gens3-6, Soul Dew boosts Latis' Sp. Atk and Sp. Def. In Gen7+ it boosts the power of their Psychic and Dragon type moves instead. #define B_NET_BALL_MODIFIER GEN_LATEST // In Gen7+, Net Ball's catch multiplier is x5 instead of x3. -#define B_DIVE_BALL_MODIFIER GEN_LATEST // In Gen4+, Dive Ball's effectiveness increases by when Surfing or Fishing. +#define B_DIVE_BALL_MODIFIER GEN_LATEST // In Gen4+, Dive Ball's effectiveness increases by x3.5 when Surfing or Fishing. #define B_NEST_BALL_MODIFIER GEN_LATEST // Nest Ball's formula varies depending on the Gen. See Cmd_handleballthrow. #define B_REPEAT_BALL_MODIFIER GEN_LATEST // In Gen7+, Repeat Ball's catch multiplier is x3.5 instead of x3. #define B_TIMER_BALL_MODIFIER GEN_LATEST // In Gen5+, Timer Ball's effectiveness increases by x0.3 per turn instead of x0.1 diff --git a/include/config/overworld.h b/include/config/overworld.h index 2e1e1d7b12..c792c76678 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -44,7 +44,7 @@ // 16x32, 32x32, 64x64 etc are fine #define OW_MON_WANDER_WALK TRUE // If true, OW pokemon with MOVEMENT_TYPE_WANDER will walk-in-place in between steps. // Follower Pokémon -#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! +#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! #define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations #define OW_FOLLOWERS_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball @@ -79,7 +79,7 @@ // Map pop-up config #define OW_POPUP_GENERATION GEN_3 // Different generations display location names in overworld pop-ups differently. - // Only choies are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. + // Only choices are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. // Gen5 map pop-up config // Constants diff --git a/migration_scripts/README.md b/migration_scripts/README.md index 5ae26c1c0a..5ff925d8ef 100644 --- a/migration_scripts/README.md +++ b/migration_scripts/README.md @@ -11,7 +11,7 @@ These scripts exist to help developers make the transition between refactored sy All migration scripts require [`python3`](https://www.python.org/downloads/) to be installed. Migration scripts are executed by running the following commands from the root directory of a developer's project. ```bash -chmod +x migration_scripts/*.py ; #give permision to make the script executable +chmod +x migration_scripts/*.py ; #give permission to make the script executable python3 migration_scripts/*.py ; #run the migration script ``` diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 6e0230cf31..b6d0aaf3ca 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1938,8 +1938,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = { .name = COMPOUND_STRING("Growth"), .description = COMPOUND_STRING( + #if B_GROWTH_STAT_RAISE >= GEN_5 + "Forces the body to grow,\n" + "raising Attack and Sp. Atk."), + #else "Forces the body to grow\n" "and heightens Sp. Atk."), + #endif .effect = B_GROWTH_STAT_RAISE >= GEN_5 ? EFFECT_GROWTH : EFFECT_SPECIAL_ATTACK_UP, .power = 0, .type = TYPE_NORMAL, diff --git a/src/party_menu.c b/src/party_menu.c index 5214ddc2be..32ccd6ca19 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4672,7 +4672,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) if (canHeal == TRUE) { if (hp == 0) - AnimatePartySlot(gPartyMenu.slotId, 1); + AnimatePartySlot(gPartyMenu.slotId, 1); PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_DisplayHPRestoredMessage); ResetHPTaskData(taskId, 0, hp); return; diff --git a/src/pokemon.c b/src/pokemon.c index 66fb83332f..0583939a85 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -684,7 +684,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = #elif P_LVL_UP_LEARNSETS >= GEN_8 #include "data/pokemon/level_up_learnsets/gen_8.h" // Sword/Shield #elif P_LVL_UP_LEARNSETS >= GEN_7 -#include "data/pokemon/level_up_learnsets/gen_7.h" // Ultra Sun/ Ultra Moon +#include "data/pokemon/level_up_learnsets/gen_7.h" // Ultra Sun/Ultra Moon #elif P_LVL_UP_LEARNSETS >= GEN_6 #include "data/pokemon/level_up_learnsets/gen_6.h" // Omega Ruby/Alpha Sapphire #elif P_LVL_UP_LEARNSETS >= GEN_5 From 76656e85c2f682f35d2504ee4a46c8c2f37dad0b Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:10:29 +0100 Subject: [PATCH 22/34] Fix Quash implementation, adds After You and Quash missing configs + tests (#5400) * Fix Quash + After You and Quash configs * Add tests --- include/config/battle.h | 2 + src/battle_script_commands.c | 41 ++++++++----- test/battle/move_effect/after_you.c | 49 ++++++++++++++- test/battle/move_effect/quash.c | 92 ++++++++++++++++++++++++++++- 4 files changed, 163 insertions(+), 21 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 402b5db6cf..b00eb199a9 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -123,6 +123,8 @@ #define B_HEAL_BELL_SOUNDPROOF GEN_LATEST // In Gen5, Heal Bell affects all mons with Soundproof. In Gen6-8 it affects inactive mons, but not battlers. In Gen9 it always affects the user. #define B_CHARGE GEN_LATEST // In Gen8-, Charge status is lost regardless of the typing of the next move. #define B_POWDER_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. +#define B_AFTER_YOU_TURN_ORDER GEN_LATEST // In Gen8+, After You doesn't fail if the turn order wouldn't change after use. +#define B_QUASH_TURN_ORDER GEN_LATEST // In Gen8+, Quash-affected battlers move according to speed order. Before Gen8, Quash-affected battlers move in the order they were affected by Quash. // Ability settings #define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1e4b10e928..ee2a148831 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8929,9 +8929,10 @@ static bool32 ChangeOrderTargetAfterAttacker(void) u8 data[MAX_BATTLERS_COUNT]; u8 actionsData[MAX_BATTLERS_COUNT]; - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) - || GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) return FALSE; + if (GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget)) + return B_AFTER_YOU_TURN_ORDER >= GEN_8; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -8944,8 +8945,6 @@ static bool32 ChangeOrderTargetAfterAttacker(void) gActionsByTurnOrder[1] = actionsData[2]; gBattlerByTurnOrder[2] = data[1]; gActionsByTurnOrder[2] = actionsData[1]; - gBattlerByTurnOrder[3] = data[3]; - gActionsByTurnOrder[3] = actionsData[3]; } else if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 3) { @@ -17110,7 +17109,7 @@ void BS_TryActivateGulpMissile(void) void BS_TryQuash(void) { NATIVE_ARGS(const u8 *failInstr); - u32 i; + u32 i, j; // It's true if foe is faster, has a bigger priority, or switches if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) @@ -17121,19 +17120,29 @@ void BS_TryQuash(void) // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit gProtectStructs[gBattlerTarget].quash = TRUE; - for (i = 0; i < gBattlersCount; i++) + + if (B_QUASH_TURN_ORDER < GEN_8) { - gBattlerByTurnOrder[i] = i; - } - for (i = 0; i < gBattlersCount - 1; i++) - { - s32 j; - for (j = i + 1; j < gBattlersCount; j++) + // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order + j = GetBattlerTurnOrderNum(gBattlerTarget); + for (i = j + 1; i < gBattlersCount; i++) { - if (!gProtectStructs[i].quash - && !gProtectStructs[j].quash - && GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) - SwapTurnOrder(i, j); + SwapTurnOrder(i, j); + j++; + } + } + else + { + // Gen 8+ config only alters Turn Order of battlers affected by Quash, dynamic speed should handle the rest + for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount - 1; i++) + { + for (j = i + 1; j < gBattlersCount; j++) + { + u32 battler1 = gBattlerByTurnOrder[i], battler2 = gBattlerByTurnOrder[j]; + if ((gProtectStructs[battler1].quash || gProtectStructs[battler2].quash) + && GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + SwapTurnOrder(i, j); + } } } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index b788fab725..32ea44efb1 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -52,7 +52,7 @@ DOUBLE_BATTLE_TEST("After You does nothing if the target has already moved") } } -DOUBLE_BATTLE_TEST("After You calculates correct targets if only one pokemon is left on the opposing side") +DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one pokemon is left on the opposing side") { GIVEN { PLAYER(SPECIES_GRENINJA) { Speed(120); } @@ -86,5 +86,48 @@ DOUBLE_BATTLE_TEST("After You calculates correct targets if only one pokemon is } } -TO_DO_BATTLE_TEST("After You doesn't fail if the turner remains the same after After You (Gen8+)"); -TO_DO_BATTLE_TEST("After You ignores the effects of Quash"); +DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)") +{ + GIVEN { + ASSUME(B_AFTER_YOU_TURN_ORDER >= GEN_8); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WYNAUT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(3); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("After You ignores the effects of Quash") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_QUASH].effect == EFFECT_QUASH); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WYNAUT) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(3); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index fd2bd9d877..5500fcb33e 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -32,14 +32,102 @@ DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") PLAYER(SPECIES_WOBBUFFET) { Speed(30); } OPPONENT(SPECIES_TORCHIC) { Speed(50); } OPPONENT(SPECIES_TREECKO) { Speed(40); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(opponentRight, MOVE_TAILWIND); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Quash calculates correct turn order if only one pokemon is left on the opposing side") +{ + GIVEN { + PLAYER(SPECIES_GRENINJA) { Speed(120); } + PLAYER(SPECIES_REGIROCK) { Speed(100); } + OPPONENT(SPECIES_PIDGEOT) { Speed(10); } + OPPONENT(SPECIES_DRAGONITE) { Speed(60); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_QUASH, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + } + TURN { + MOVE(playerLeft, MOVE_QUASH, target: playerRight); + MOVE(playerRight, MOVE_STONE_EDGE, target: opponentRight); + MOVE(opponentRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentLeft); + MESSAGE("Foe Pidgeot fainted!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STONE_EDGE, playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+) or from first affected battler to last (Gen 7-)") +{ + u32 speedLeft, speedRight; + + PARAMETRIZE { speedLeft = 60; speedRight = 50; } + PARAMETRIZE { speedLeft = 50; speedRight = 60; } + GIVEN { + PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } + PLAYER(SPECIES_WOBBUFFET) { Speed(70); } + OPPONENT(SPECIES_TORCHIC) { Speed(speedLeft); } + OPPONENT(SPECIES_TREECKO) { Speed(speedRight); } } WHEN { TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentRight); + MOVE(playerRight, MOVE_QUASH, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerRight); + if (B_QUASH_TURN_ORDER < GEN_8) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } + else if (speedLeft > speedRight) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + } + else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed") +{ + GIVEN { + ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); + ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(gMovesInfo[MOVE_AFTER_YOU].effect == EFFECT_AFTER_YOU); + PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_TORCHIC) { Speed(10); } + OPPONENT(SPECIES_TREECKO) { Speed(40); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_QUASH, target: opponentLeft); + MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft); MOVE(opponentLeft, MOVE_TAILWIND); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); // this is the relevant part, testing if quash affected battler becomes last to move causing playerRight to not move } } From 71dfd3e7c03bb02f80b8071b4f3d191ee69406f8 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 19 Sep 2024 00:25:53 +0200 Subject: [PATCH 23/34] Ogerpon masks were missing their hold effects (#5391) * Ogerpon masks were missing their hold effects * fix wrong num * test * correct tests and additional fix * added hold effect to battle debug --- include/constants/hold_effects.h | 5 ++-- src/battle_debug.c | 2 ++ src/battle_util.c | 4 +++ src/data/items.h | 6 +++++ test/battle/hold_effect/ogerpon_mask.c | 36 ++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/battle/hold_effect/ogerpon_mask.c diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 0f364d2462..a159102932 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -155,11 +155,12 @@ // Gen9 hold effects #define HOLD_EFFECT_ABILITY_SHIELD 175 #define HOLD_EFFECT_CLEAR_AMULET 176 -#define HOLD_EFFECT_MIRROR_HERB 177 // Not implemented. +#define HOLD_EFFECT_MIRROR_HERB 177 #define HOLD_EFFECT_PUNCHING_GLOVE 178 #define HOLD_EFFECT_COVERT_CLOAK 179 #define HOLD_EFFECT_LOADED_DICE 180 -#define HOLD_EFFECT_BOOSTER_ENERGY 181 // Not implemented. +#define HOLD_EFFECT_BOOSTER_ENERGY 181 +#define HOLD_EFFECT_OGERPON_MASK 182 // Gen2 hold effect #define HOLD_EFFECT_BERSERK_GENE 184 diff --git a/src/battle_debug.c b/src/battle_debug.c index b088aa73ba..c3b4ac85aa 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2435,6 +2435,7 @@ static const u8 sText_HoldEffectCovertCloak[] = _("Covert Cloak"); static const u8 sText_HoldEffectLoadedDice[] = _("Loaded Dice"); static const u8 sText_HoldEffectBoosterEnergy[] = _("Booster Energy"); static const u8 sText_HoldEffectBerserkGene[] = _("Berserk Gene"); +static const u8 sText_HoldEffectOgerponMask[] = _("Ogerpon Mask"); static const u8 *const sHoldEffectNames[] = { [HOLD_EFFECT_NONE] = sText_HoldEffectNone, @@ -2585,6 +2586,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_LOADED_DICE] = sText_HoldEffectLoadedDice, [HOLD_EFFECT_BOOSTER_ENERGY] = sText_HoldEffectBoosterEnergy, [HOLD_EFFECT_BERSERK_GENE] = sText_HoldEffectBerserkGene, + [HOLD_EFFECT_OGERPON_MASK] = sText_HoldEffectOgerponMask, }; static const u8 *GetHoldEffectName(u16 holdEffect) { diff --git a/src/battle_util.c b/src/battle_util.c index a3711f161c..612965fff2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9454,6 +9454,10 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 if (gMovesInfo[move].punchingMove) modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); break; + case HOLD_EFFECT_OGERPON_MASK: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_OGERPON) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); + break; } // Terastallization boosts weak, non-priority, non-multi hit moves after modifiers to 60 BP. diff --git a/src/data/items.h b/src/data/items.h index f97c4670c1..adfb1914a2 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -13659,6 +13659,8 @@ const struct Item gItemsInfo[] = { .name = HANDLE_EXPANDED_ITEM_NAME("CornrstneMask", "Cornerstone Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Rock-\n" @@ -13674,6 +13676,8 @@ const struct Item gItemsInfo[] = { .name = HANDLE_EXPANDED_ITEM_NAME("WellsprngMask", "Wellspring Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Water-\n" @@ -13689,6 +13693,8 @@ const struct Item gItemsInfo[] = { .name = HANDLE_EXPANDED_ITEM_NAME("HrthflameMask", "Hearthflame Mask"), .price = 0, + .holdEffect = HOLD_EFFECT_OGERPON_MASK, + .holdEffectParam = 20, .description = COMPOUND_STRING( "Allows Ogerpon to\n" "wield the Fire-\n" diff --git a/test/battle/hold_effect/ogerpon_mask.c b/test/battle/hold_effect/ogerpon_mask.c new file mode 100644 index 0000000000..31fb0511f4 --- /dev/null +++ b/test/battle/hold_effect/ogerpon_mask.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_CORNERSTONE_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_WELLSPRING_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_HEARTHFLAME_MASK].holdEffect == HOLD_EFFECT_OGERPON_MASK); + ASSUME(gItemsInfo[ITEM_CORNERSTONE_MASK].holdEffectParam == 20); + ASSUME(gItemsInfo[ITEM_WELLSPRING_MASK].holdEffectParam == 20); + ASSUME(gItemsInfo[ITEM_HEARTHFLAME_MASK].holdEffectParam == 20); +} + +SINGLE_BATTLE_TEST("Ogerpon Masks increase the base power of moves by 20%", s16 damage) +{ + u32 species; + u32 item; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL_MASK; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING_MASK; item = ITEM_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_MASK; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE_MASK; item = ITEM_HEARTHFLAME_MASK; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + PLAYER(species) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[2].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[3].damage); + } +} From 68c51f84121f12dc87737ad3283a3e5a974f4093 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:00:32 +0200 Subject: [PATCH 24/34] Fixes Spiky Shield Counter interaction (#5402) * Fixes Spiky Shield Counter interaction * Update test/battle/move_effect/protect.c --------- Co-authored-by: Bassoonian --- src/battle_script_commands.c | 4 +++- test/battle/move_effect/protect.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ee2a148831..0048cf14e4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5448,7 +5448,9 @@ static void Cmd_moveend(void) case MOVEEND_PROTECT_LIKE_EFFECT: if (gProtectStructs[gBattlerAttacker].touchedProtectLike) { - if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + if (gProtectStructs[gBattlerTarget].spikyShielded + && gMovesInfo[gCurrentMove].effect != EFFECT_COUNTER + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index aca5ef859d..60b55ebb75 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -547,3 +547,22 @@ DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all MESSAGE("Foe Sunflora's Defense rose!"); } } + +SINGLE_BATTLE_TEST("Spiky Shield does not damage users on Counter or Mirror Coat") +{ + u32 move; + PARAMETRIZE { move = MOVE_MIRROR_COAT; } + PARAMETRIZE { move = MOVE_COUNTER; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPIKY_SHIELD); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKY_SHIELD, player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(opponent); + } + } +} From f7d2e62cccd9e5b27829a31f280aa9b096d34d66 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 21 Sep 2024 11:51:08 -0500 Subject: [PATCH 25/34] Fix Switcheroo giving score even if the opponent has no held item (#5412) --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 869f5dded3..1483c875ba 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4065,7 +4065,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 (move != MOVE_BESTOW && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE) { switch (aiData->holdEffects[battlerDef]) { From 39a8a77d3d74294b52ca5c81333132398126a952 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 21 Sep 2024 13:28:20 -0500 Subject: [PATCH 26/34] Play point animation when sending a follower into battle (#5406) * Add point animation when sending a follower into battle * Update trainers.h --- src/battle_controllers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 929aa2a59d..37e89d8acb 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2903,7 +2903,7 @@ void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, c if (side == B_SIDE_PLAYER) { StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], ShouldDoSlideInAnim() ? 2 : 1); paletteNum = AllocSpritePalette(tagTrainerPal); LoadCompressedPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); From 832a7b286d3cedf202ae1af238b58abd66879511 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sat, 21 Sep 2024 21:22:30 +0200 Subject: [PATCH 27/34] Update item_use.c (#5415) --- src/item_use.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item_use.c b/src/item_use.c index fd74b7082b..d38c4b1f98 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1491,7 +1491,7 @@ void FieldUseFunc_VsSeeker(u8 taskId) SetUpItemUseOnFieldCallback(taskId); } else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]); + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].tUsingRegisteredKeyItem); } void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId) From 16e8be12335695e5fdb7100f1706a292f1f60ed0 Mon Sep 17 00:00:00 2001 From: kleenxfeu <149011275+kleenxfeu@users.noreply.github.com> Date: Sat, 21 Sep 2024 23:47:19 +0200 Subject: [PATCH 28/34] Mega evolution animation is a little smoother (#4816) * Smoother primal/mega animation * Just to make the CI run. It needs to run * Update src/battle_anim_effects_3.c --------- Co-authored-by: kleeenexfeu <94004034+kleeenexfeu@users.noreply.github.com> Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- data/battle_anim_scripts.s | 8 ++-- src/battle_anim_effects_3.c | 82 +++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 2f1a3cb73c..0435eb8e77 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -28060,7 +28060,7 @@ General_MegaEvolution: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28251,7 +28251,7 @@ General_PrimalReversion_Alpha: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28278,7 +28278,7 @@ General_PrimalReversion_Omega: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish @@ -28314,7 +28314,7 @@ General_UltraBurst:: call LightThatBurnsTheSkyGreenSparks delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA - createvisualtask AnimTask_TransformMon, 2, 1, 0 + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index ed2e7457f6..0b5f3fcf94 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -2378,6 +2378,88 @@ void AnimTask_SwallowDeformMon(u8 taskId) } } +void AnimTask_HideSwapSprite(u8 taskId) +{ + int i, j; + u8 position; + struct BattleAnimBgData animBg; + u8 *dest; + u8 *src; + u16 *bgTilemap; + + u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + + switch (gTasks[taskId].data[0]) + { + case 0: + gTasks[taskId].data[11] = gSprites[spriteId].x; // Save battler position + gSprites[spriteId].x = -64; // hide it from screen to avoid the blip/glitch effect when swapping the sprite. + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + gTasks[taskId].data[0]++; + break; + case 1: + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gBattleAnimArgs[1]); + GetBgDataForTransform(&animBg, gBattleAnimAttacker); + + if (IsContest()) + position = 0; + else + position = GetBattlerPosition(gBattleAnimAttacker); + + src = gMonSpritesGfxPtr->spritesGfx[position]; + dest = animBg.bgTiles; + CpuCopy32(src, dest, MON_PIC_SIZE); + LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset); + if (IsContest()) + { + if (IsSpeciesNotUnown(gContestResources->moveAnim->species) != IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies)) + { + bgTilemap = (u16 *)animBg.bgTilemap; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = bgTilemap[j + i * 0x20]; + bgTilemap[j + i * 0x20] = bgTilemap[(7 - j) + i * 0x20]; + bgTilemap[(7 - j) + i * 0x20] = temp; + } + } + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + bgTilemap[j + i * 0x20] ^= 0x400; + } + } + } + + if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies)) + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest; + else + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteOpponentSide; + + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL); + } + + gTasks[taskId].data[0]++; + break; + case 2: + gSprites[spriteId].x = gTasks[taskId].data[11]; // restores battler position + if (!IsContest()) + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + { + if (gTasks[taskId].data[10] == 0) + SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies); + } + } + + DestroyAnimVisualTask(taskId); + break; + } +} + void AnimTask_TransformMon(u8 taskId) { int i, j; From d695a6240dbbd6bcdd7785fd172119efb3e49146 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Sun, 22 Sep 2024 05:25:42 -0400 Subject: [PATCH 29/34] Convert settotemboost command to callnative (#5418) * settotemboost use callnative * Update src/battle_main.c --------- Co-authored-by: ghoulslash Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- asm/macros/event.inc | 18 +++++++++--------- data/specials.inc | 1 - src/battle_main.c | 16 ++++++++-------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 83338673cf..c5a83a28f7 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2105,15 +2105,15 @@ @ The rest of the arguments are the stat change values to each stat. @ For example, giving the first opponent +1 to atk and -2 to speed would be: settotemboost B_POSITION_OPPONENT_LEFT, 1, 0, -2 .macro settotemboost battler:req, atk=0,def=0,speed=0,spatk=0,spdef=0,acc=0,evas=0 - setvar VAR_0x8000, \battler - setvar VAR_0x8001, \atk - setvar VAR_0x8002, \def - setvar VAR_0x8003, \speed - setvar VAR_0x8004, \spatk - setvar VAR_0x8005, \spdef - setvar VAR_0x8006, \acc - setvar VAR_0x8007, \evas - special SetTotemBoost + callnative ScriptSetTotemBoost + .2byte \battler + .2byte \atk + .2byte \def + .2byte \speed + .2byte \spatk + .2byte \spdef + .2byte \acc + .2byte \evas .endm @ useful totem boost macros diff --git a/data/specials.inc b/data/specials.inc index f02497d603..5ebb3d0ee1 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -534,7 +534,6 @@ gSpecials:: def_special RemoveRecordsWindow def_special CloseDeptStoreElevatorWindow def_special TrySetBattleTowerLinkType - def_special SetTotemBoost def_special TrySpecialOverworldEvo def_special GetNumberSprayStrength def_special GetSprayId diff --git a/src/battle_main.c b/src/battle_main.c index d011cde1db..a9336c3f8b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -43,6 +43,7 @@ #include "roamer.h" #include "safari_zone.h" #include "scanline_effect.h" +#include "script.h" #include "sound.h" #include "sprite.h" #include "string_util.h" @@ -5935,21 +5936,20 @@ void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk) } } -// special to set a field's totem boost(s) -// inputs: -// var8000: battler -// var8001 - var8007: stat changes -void SetTotemBoost(void) +// Queues stat boosts for a given battler for totem battles +void ScriptSetTotemBoost(struct ScriptContext *ctx) { - u32 battler = gSpecialVar_0x8000; + u32 battler = VarGet(ScriptReadHalfword(ctx)); + u32 stat; u32 i; for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) { - if (*(&gSpecialVar_0x8001 + i)) + stat = VarGet(ScriptReadHalfword(ctx)); + if (stat) { gQueuedStatBoosts[battler].stats |= (1 << i); - gQueuedStatBoosts[battler].statChanges[i] = *(&gSpecialVar_0x8001 + i); + gQueuedStatBoosts[battler].statChanges[i] = stat; gQueuedStatBoosts[battler].stats |= 0x80; // used as a flag for the "totem flared to life" script } } From d122c0a22233c7a0097c58f9b1ff2fa1fbfc8633 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 22 Sep 2024 14:14:15 +0200 Subject: [PATCH 30/34] Fix affection check for exp multiplier --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0048cf14e4..c65e1455d8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16193,7 +16193,7 @@ void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBat *expAmount = (*expAmount * 150) / 100; if (B_UNEVOLVED_EXP_MULTIPLIER >= GEN_6 && IsMonPastEvolutionLevel(&gPlayerParty[expGetterMonId])) *expAmount = (*expAmount * 4915) / 4096; - if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(expGetterMonId) >= AFFECTION_FOUR_HEARTS) + if (B_AFFECTION_MECHANICS == TRUE && GetMonAffectionHearts(&gPlayerParty[expGetterMonId]) >= AFFECTION_FOUR_HEARTS) *expAmount = (*expAmount * 4915) / 4096; if (CheckBagHasItem(ITEM_EXP_CHARM, 1)) //is also for other exp boosting Powers if/when implemented *expAmount = (*expAmount * 150) / 100; From 918d45a6232ad2c29f93f655d001c68b12a7b9d8 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 22 Sep 2024 16:33:17 +0200 Subject: [PATCH 31/34] Fix default tera type changing upon evolution/form change (#5422) --- src/evolution_scene.c | 19 +++++++------------ src/pokemon.c | 2 ++ test/pokemon.c | 11 ++++++++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 98879430cb..6119494907 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -545,19 +545,13 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) { u32 data = 0; - #if P_SHEDINJA_BALL >= GEN_4 - u16 ball = ITEM_POKE_BALL; - #endif + u16 ball = ITEM_POKE_BALL; const struct Evolution *evolutions = GetSpeciesEvolutions(preEvoSpecies); if (evolutions == NULL) return; - if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE - #if P_SHEDINJA_BALL >= GEN_4 - && (CheckBagHasItem(ball, 1)) - #endif - ) + if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) { s32 i; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; @@ -567,10 +561,11 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[1].targetSpecies)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); - #if P_SHEDINJA_BALL >= GEN_4 - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); - RemoveBagItem(ball, 1); - #endif + if (P_SHEDINJA_BALL >= GEN_4) + { + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); + RemoveBagItem(ball, 1); + } for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); diff --git a/src/pokemon.c b/src/pokemon.c index 0583939a85..e186ce4d51 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2791,6 +2791,8 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { const u8 *types = gSpeciesInfo[substruct0->species].types; retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; + // To avoid this value changing upon form change/evolution, we directly set it for future cases + SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &retVal); } else { diff --git a/test/pokemon.c b/test/pokemon.c index 8419b9c7e1..562b8b10a3 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -325,20 +325,25 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE); } -TEST("checkteratype/setteratype work") +TEST("checkteratype works") { CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); RUN_OVERWORLD_SCRIPT( checkteratype 0; ); - EXPECT(VarGet(VAR_RESULT) == TYPE_PSYCHIC); + EXPECT_EQ(VarGet(VAR_RESULT), TYPE_PSYCHIC); +} + +TEST("setteratype works") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); RUN_OVERWORLD_SCRIPT( setteratype TYPE_FIRE, 0; checkteratype 0; ); - EXPECT(VarGet(VAR_RESULT) == TYPE_FIRE); + EXPECT_EQ(VarGet(VAR_RESULT), TYPE_FIRE); } TEST("createmon [simple]") From acd07ccfc10adb701f015d6d8f9e061c5ba1add0 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:44:18 -0400 Subject: [PATCH 32/34] add rocky helmet dmg to tangling hair + defiant test to ensure original battler IDs from chaining effects (#5423) Co-authored-by: ghoulslash --- test/battle/ability/tangling_hair.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/battle/ability/tangling_hair.c b/test/battle/ability/tangling_hair.c index 0dbc0264ce..508678a037 100644 --- a/test/battle/ability/tangling_hair.c +++ b/test/battle/ability/tangling_hair.c @@ -50,10 +50,10 @@ SINGLE_BATTLE_TEST("Tangling Hair does not cause Rocky Helmet miss activation") } } -SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant") +SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant and keeps original attacker/target") { GIVEN { - PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); Item(ITEM_ROCKY_HELMET); } OPPONENT(SPECIES_PAWNIARD) { Ability(ABILITY_DEFIANT); } } WHEN { TURN { MOVE(opponent, MOVE_TACKLE); } @@ -64,5 +64,7 @@ SINGLE_BATTLE_TEST("Tangling Hair Speed stat drop triggers defiant") MESSAGE("Foe Pawniard's Speed fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); MESSAGE("Foe Pawniard's Attack sharply rose!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Foe Pawniard was hurt by Dugtrio's Rocky Helmet!"); } } From 55086586c57cc867fa45f618669f53cca2aa8987 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sun, 22 Sep 2024 16:59:43 -0700 Subject: [PATCH 33/34] Revert 5422 (#5424) --- src/evolution_scene.c | 19 ++++++++++++------- src/pokemon.c | 2 -- test/pokemon.c | 11 +++-------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 6119494907..98879430cb 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -545,13 +545,19 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) { u32 data = 0; - u16 ball = ITEM_POKE_BALL; + #if P_SHEDINJA_BALL >= GEN_4 + u16 ball = ITEM_POKE_BALL; + #endif const struct Evolution *evolutions = GetSpeciesEvolutions(preEvoSpecies); if (evolutions == NULL) return; - if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) + if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE + #if P_SHEDINJA_BALL >= GEN_4 + && (CheckBagHasItem(ball, 1)) + #endif + ) { s32 i; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; @@ -561,11 +567,10 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[1].targetSpecies)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); - if (P_SHEDINJA_BALL >= GEN_4) - { - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); - RemoveBagItem(ball, 1); - } + #if P_SHEDINJA_BALL >= GEN_4 + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); + RemoveBagItem(ball, 1); + #endif for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); diff --git a/src/pokemon.c b/src/pokemon.c index e186ce4d51..0583939a85 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2791,8 +2791,6 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { const u8 *types = gSpeciesInfo[substruct0->species].types; retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; - // To avoid this value changing upon form change/evolution, we directly set it for future cases - SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &retVal); } else { diff --git a/test/pokemon.c b/test/pokemon.c index 562b8b10a3..8419b9c7e1 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -325,25 +325,20 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE); } -TEST("checkteratype works") +TEST("checkteratype/setteratype work") { CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); RUN_OVERWORLD_SCRIPT( checkteratype 0; ); - EXPECT_EQ(VarGet(VAR_RESULT), TYPE_PSYCHIC); -} - -TEST("setteratype works") -{ - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + EXPECT(VarGet(VAR_RESULT) == TYPE_PSYCHIC); RUN_OVERWORLD_SCRIPT( setteratype TYPE_FIRE, 0; checkteratype 0; ); - EXPECT_EQ(VarGet(VAR_RESULT), TYPE_FIRE); + EXPECT(VarGet(VAR_RESULT) == TYPE_FIRE); } TEST("createmon [simple]") From e67d5a23ed54a0fc8a584199d99fe3019804bbbd Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:40:44 +0100 Subject: [PATCH 34/34] Adds some Snatch interactions, fixes for Dragon Darts, Trace, Primal Reversion, Protosynthesis/Quark Drive (#5430) * Fixes Electrified Dragon Darts sometimes targeting battlers with absorbing abilities (Volt Absorb, Motor Drive) * Add Snatch interactions with Dancer, Swallow * Trace fix + cleanup * Simplify Quash * Fixes multiple mons with Primal Reversion causing only one Primal Reversion, add tests * Fix Booster Energy Ability Popup * Accidentally removed healing from Swallow * More Trace cleanup --- data/battle_scripts_1.s | 12 +-- include/battle.h | 3 +- include/battle_scripts.h | 1 - include/battle_util.h | 2 +- src/battle_script_commands.c | 52 ++++++------ src/battle_util.c | 29 +++---- test/battle/ability/dancer.c | 79 +++++++++++++++++ test/battle/ability/trace.c | 15 ++++ test/battle/form_change/primal_reversion.c | 98 ++++++++++++++++++++++ test/battle/move_effect/dragon_darts.c | 77 +++++++++++++++++ 10 files changed, 313 insertions(+), 55 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 06b82f43b7..94f5736317 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6961,12 +6961,12 @@ BattleScript_WishMegaEvolution:: BattleScript_PrimalReversion:: call BattleScript_PrimalReversionRet - end2 + end3 BattleScript_PrimalReversionRestoreAttacker:: call BattleScript_PrimalReversionRet copybyte gBattlerAttacker, sSAVED_BATTLER - end2 + end3 BattleScript_PrimalReversionRet:: flushtextbox @@ -7675,15 +7675,11 @@ BattleScript_EmergencyExitWildNoPopUp:: BattleScript_TraceActivates:: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_PKMNTRACED waitmessage B_WAIT_TIME_LONG settracedability BS_SCRIPTING switchinabilities BS_SCRIPTING - return - -BattleScript_TraceActivatesEnd3:: - call BattleScript_TraceActivates end3 BattleScript_ReceiverActivates:: @@ -10011,7 +10007,7 @@ BattleScript_BerserkGeneRet_End: BattleScript_BoosterEnergyEnd2:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - call BattleScript_AbilityPopUpTarget + call BattleScript_AbilityPopUpScripting printstring STRINGID_BOOSTERENERGYACTIVATES waitmessage B_WAIT_TIME_MED printstring STRINGID_STATWASHEIGHTENED diff --git a/include/battle.h b/include/battle.h index 91233c8fe8..582dcedfc2 100644 --- a/include/battle.h +++ b/include/battle.h @@ -93,7 +93,7 @@ struct ResourceFlags #define RESOURCE_FLAG_ROOST 0x2 #define RESOURCE_FLAG_UNBURDEN 0x4 #define RESOURCE_FLAG_UNUSED 0x8 -#define RESOURCE_FLAG_TRACED 0x10 +#define RESOURCE_FLAG_UNUSED_2 0x10 #define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 #define RESOURCE_FLAG_NEUTRALIZING_GAS 0x40 #define RESOURCE_FLAG_ICE_FACE 0x80 @@ -751,6 +751,7 @@ struct BattleStruct u8 blunderPolicy:1; // should blunder policy activate u8 swapDamageCategory:1; // Photon Geyser, Shell Side Arm, Light That Burns the Sky u8 bouncedMoveIsUsed:1; + u8 snatchedMoveIsUsed:1; u8 descriptionSubmenu:1; // For Move Description window in move selection screen u8 ackBallUseBtn:1; // Used for the last used ball feature u8 ballSwapped:1; // Used for the last used ball feature diff --git a/include/battle_scripts.h b/include/battle_scripts.h index e98790764d..84c1b70cf4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -166,7 +166,6 @@ extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; -extern const u8 BattleScript_TraceActivatesEnd3[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; extern const u8 BattleScript_ShedSkinActivates[]; diff --git a/include/battle_util.h b/include/battle_util.h index 3a64b84462..ec8c03a6bd 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -256,7 +256,7 @@ bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument); bool32 MoveHasChargeTurnAdditionalEffect(u32 move); bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); -bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef); +bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); bool32 CanBeSlept(u32 battler, u32 ability); bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c65e1455d8..b018535cbe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1401,6 +1401,7 @@ static void Cmd_attackcanceler(void) if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gMovesInfo[gCurrentMove].snatchAffected) { gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; + gBattleStruct->snatchedMoveIsUsed = TRUE; gBattleScripting.battler = gBattlerByTurnOrder[i]; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; @@ -6287,7 +6288,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_DANCER: // Special case because it's so annoying - if (gMovesInfo[gCurrentMove].danceMove) + if (gMovesInfo[gCurrentMove].danceMove && !gBattleStruct->snatchedMoveIsUsed) { u32 battler, nextDancer = 0; bool32 hasDancerTriggered = FALSE; @@ -6431,6 +6432,7 @@ static void Cmd_moveend(void) gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; gBattleStruct->bouncedMoveIsUsed = FALSE; + gBattleStruct->snatchedMoveIsUsed = FALSE; gBattleStruct->enduredDamage = 0; gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; @@ -11537,7 +11539,7 @@ static void Cmd_stockpiletohpheal(void) const u8 *failInstr = cmd->failInstr; - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) + if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) { gBattlescriptCurrInstr = failInstr; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; @@ -11553,14 +11555,22 @@ static void Cmd_stockpiletohpheal(void) } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) + { + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + gBattleStruct->moveEffect2 = MOVE_EFFECT_STOCKPILE_WORE_OFF; + } + else // Snatched move + { + gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleScripting.animTurn = 1; + } if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gBattleStruct->moveEffect2 = MOVE_EFFECT_STOCKPILE_WORE_OFF; + gBattlescriptCurrInstr = cmd->nextInstr; gBattlerTarget = gBattlerAttacker; } @@ -17122,30 +17132,18 @@ void BS_TryQuash(void) // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit gProtectStructs[gBattlerTarget].quash = TRUE; - - if (B_QUASH_TURN_ORDER < GEN_8) + + // this implementation assumes turn order is correct when using Quash + i = GetBattlerTurnOrderNum(gBattlerTarget); + for (j = i + 1; j < gBattlersCount; j++) { // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order - j = GetBattlerTurnOrderNum(gBattlerTarget); - for (i = j + 1; i < gBattlersCount; i++) - { + // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest + if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) SwapTurnOrder(i, j); - j++; - } - } - else - { - // Gen 8+ config only alters Turn Order of battlers affected by Quash, dynamic speed should handle the rest - for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - u32 battler1 = gBattlerByTurnOrder[i], battler2 = gBattlerByTurnOrder[j]; - if ((gProtectStructs[battler1].quash || gProtectStructs[battler2].quash) - && GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) - SwapTurnOrder(i, j); - } - } + else + break; + i++; } gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index 612965fff2..86e846d09c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4368,13 +4368,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_TRACED) - break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (!gAbilitiesInfo[gBattleMons[target1].ability].cantBeTraced && gBattleMons[target1].hp != 0 @@ -4393,11 +4390,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (effect != 0) { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivatesEnd3); - gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_TRACED; + BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gBattleStruct->tracedAbility[battler] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability - battler = gBattlerAbility = gBattleScripting.battler = battler; + gBattlerAbility = battler; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, chosenTarget, gBattlerPartyIndexes[chosenTarget]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) @@ -5214,7 +5210,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GOOD_AS_GOLD: if (IS_MOVE_STATUS(gCurrentMove) - && !(moveTarget & MOVE_TARGET_USER) && !(moveTarget & MOVE_TARGET_OPPONENTS_FIELD) && !(moveTarget & MOVE_TARGET_ALL_BATTLERS)) effect = 3; @@ -6388,14 +6383,14 @@ bool32 TryPrimalReversion(u32 battler) { if (gBattlerAttacker == battler) { - BattleScriptExecute(BattleScript_PrimalReversion); + BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); } else { // edge case for scenarios like a switch-in after activated eject button gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = battler; - BattleScriptExecute(BattleScript_PrimalReversionRestoreAttacker); + BattleScriptPushCursorAndCallback(BattleScript_PrimalReversionRestoreAttacker); } return TRUE; } @@ -8706,7 +8701,7 @@ u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) u32 GetMoveTargetCount(u32 move, u32 battlerAtk, u32 battlerDef) { - switch (GetBattlerMoveTargetType(gBattlerAttacker, move)) + switch (GetBattlerMoveTargetType(battlerAtk, move)) { case MOVE_TARGET_BOTH: return !(gAbsentBattlerFlags & gBitTable[battlerDef]) @@ -11816,19 +11811,19 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) && battlerDef != BATTLE_PARTNER(battlerAtk)); } -static inline bool32 DoesCurrentTargetHaveAbilityImmunity(void) +static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerDef) { - return (AbilityBattleEffects(ABILITYEFFECT_WOULD_BLOCK, gBattlerTarget, 0, 0, 0) - || AbilityBattleEffects(ABILITYEFFECT_WOULD_ABSORB, gBattlerTarget, 0, 0, 0)); + return (AbilityBattleEffects(ABILITYEFFECT_WOULD_BLOCK, battlerDef, 0, 0, 0) + || AbilityBattleEffects(ABILITYEFFECT_WOULD_ABSORB, battlerDef, 0, 0, 0)); } -bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef) +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)) - || IsBattlerProtected(BattlerAtk, battlerDef, gCurrentMove) + return ((CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) - || DoesCurrentTargetHaveAbilityImmunity()); + || DoesBattlerHaveAbilityImmunity(battlerDef)); } diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index b39fa291c8..2132530958 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -146,6 +146,85 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") } } +DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_SNATCH].effect == EFFECT_SNATCH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_SNATCH); MOVE(playerRight, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + NONE_OF { + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].instructBanned == FALSE); + ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_DANCE); MOVE(playerLeft, MOVE_INSTRUCT, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(gMovesInfo[MOVE_TACKLE].instructBanned == FALSE); + ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ORICORIO); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); MOVE(playerRight, MOVE_DRAGON_DANCE); MOVE(opponentRight, MOVE_INSTRUCT, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponentLeft); + } +} + DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") { GIVEN { diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c index acc49bcf13..3042f8e22b 100644 --- a/test/battle/ability/trace.c +++ b/test/battle/ability/trace.c @@ -80,6 +80,21 @@ SINGLE_BATTLE_TEST("Trace will copy an opponent's ability whenever it has the ch } } + +SINGLE_BATTLE_TEST("Trace copies opponent's Intimidate and triggers it immediately") +{ + GIVEN { + PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_MASQUERAIN) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ABILITY_TRACE); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } +} + DOUBLE_BATTLE_TEST("Trace respects the turn order") { GIVEN { diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index 2f2f406827..df19a1d0d6 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -234,3 +234,101 @@ SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by EXPECT_EQ(player->species, SPECIES_GROUDON_PRIMAL); } } + + +DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_RESHIRAM); + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } +} + +DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(playerRight, ABILITY_DESOLATE_LAND); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } +} + +DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); + ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); + ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CATERPIE) { HP(1); } + PLAYER(SPECIES_SCRAFTY) { Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_RESHIRAM); + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_CATERPIE) { HP(1); } + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_STICKY_WEB); + MOVE(opponentLeft, MOVE_SPIKES); + MOVE(playerRight, MOVE_TOXIC_SPIKES); } + TURN { MOVE(playerLeft, MOVE_EXPLOSION); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerRight, ABILITY_TURBOBLAZE); + ABILITY_POPUP(opponentLeft, ABILITY_PRIMORDIAL_SEA); + ABILITY_POPUP(opponentRight, ABILITY_DESOLATE_LAND); + } THEN { + EXPECT_NE(playerLeft->hp, playerLeft->maxHP); + EXPECT_NE(playerRight->hp, playerRight->maxHP); + EXPECT_EQ(opponentLeft->status1, STATUS1_POISON); + EXPECT_EQ(opponentRight->status1, STATUS1_POISON); + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 8190f0f4bd..08913d6011 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -94,6 +94,83 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes the left ally twice if the target is a } } +DOUBLE_BATTLE_TEST("Dragon Darts strikes left ally twice if electrified and right ally has Volt Absorb") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if electrified and left ally has Volt Absorb") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes left ally twice if electrified and right ally has Motor Drive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentLeft); + MESSAGE("Hit 2 time(s)!"); + } +} + +DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if electrified and left ally has Motor Drive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + HP_BAR(opponentRight); + MESSAGE("Hit 2 time(s)!"); + } +} + + DOUBLE_BATTLE_TEST("Dragon Darts strikes the ally twice if the target is in a semi-invulnerable turn") { GIVEN {