From d88834dd586eef503bb677f9425f5876cfb6a05b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 7 Aug 2024 13:42:18 -0400 Subject: [PATCH 01/52] 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/52] 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/52] 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/52] 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 2f21073555eb6c5c4c1f60b8267f67dd44d6b8b5 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 8 Sep 2024 23:13:32 -0300 Subject: [PATCH 05/52] Fixed Tera Shift description (#5351) --- src/data/abilities.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/abilities.h b/src/data/abilities.h index ccb27ffe35..a85f114fec 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -2559,7 +2559,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = [ABILITY_TERA_SHIFT] = { .name = _("Tera Shift"), - .description = COMPOUND_STRING("Terasteralizes upon entry."), + .description = COMPOUND_STRING("Terastallizes upon entry."), .aiRating = 10, .cantBeCopied = TRUE, .cantBeSwapped = TRUE, From ab279d9f8c77064139580b466bfaa8ae446f8884 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Mon, 9 Sep 2024 02:52:48 -0500 Subject: [PATCH 06/52] Update Move Category icons (#5080) Update Category Icons to be more accurate to Gen 5 --- graphics/interface/category_icons.png | Bin 5451 -> 303 bytes src/pokemon_summary_screen.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/interface/category_icons.png b/graphics/interface/category_icons.png index 1c7d63c9eb775ab15aefe3456b2ac3cb8c47ede7..4e4a3cc2d9d3559bffa118fac7fc685f445a2b64 100644 GIT binary patch delta 288 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 z6(E<^YGzcategoryIconSpriteId == 0xFF) - sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 48, 129, 0); + sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 48, 128, 0); gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = FALSE; StartSpriteAnim(&gSprites[sMonSummaryScreen->categoryIconSpriteId], category); From fd4860d17ee93ba0cd5a8d971745b353d7a9d5dc Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 9 Sep 2024 04:41:43 -0400 Subject: [PATCH 07/52] fix missing break in ENDTURNs (#5350) Co-authored-by: ghoulslash --- src/battle_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index c0ab04b5b7..48aba80c63 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2884,9 +2884,11 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_ELECTRIFY: gStatuses4[battler] &= ~STATUS4_ELECTRIFIED; gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_POWDER: gBattleMons[battler].status2 &= ~STATUS2_POWDER; gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_THROAT_CHOP: if (gDisableStructs[battler].throatChopTimer && --gDisableStructs[battler].throatChopTimer == 0) { From d62b7270c8ee3d8e5f3d0d19e1eda948eafbdbf6 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 9 Sep 2024 10:49:05 +0200 Subject: [PATCH 08/52] Fixed trainerslide arguments (#5344) Co-authored-by: Hedara --- asm/macros/battle_script.inc | 4 ++-- data/battle_scripts_1.s | 30 +++++++++++++++--------------- data/battle_scripts_2.s | 10 +++++----- src/battle_script_commands.c | 4 ++-- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e18ce91f28..f91313cb92 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -507,9 +507,9 @@ .byte \battler .endm - .macro trainerslidein battler:req + .macro trainerslidein position:req .byte 0x53 - .byte \battler + .byte \position .endm .macro playse song:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1a80940b72..f9bb4565f0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5603,13 +5603,13 @@ BattleScript_LocalTrainerBattleWon:: BattleScript_LocalTwoTrainersDefeated:: printstring STRINGID_TWOENEMIESDEFEATED BattleScript_LocalBattleWonLoseTexts:: - trainerslidein BS_ATTACKER + trainerslidein BS_OPPONENT1 waitstate printstring STRINGID_TRAINER1LOSETEXT jumpifnotbattletype BATTLE_TYPE_TWO_OPPONENTS, BattleScript_LocalBattleWonReward - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate - trainerslidein BS_FAINTED + trainerslidein BS_OPPONENT2 waitstate printstring STRINGID_TRAINER2LOSETEXT BattleScript_LocalBattleWonReward:: @@ -5661,15 +5661,15 @@ BattleScript_LocalBattleLostPrintTrainersWinText:: waitstate returnopponentmon2toball BS_ATTACKER waitstate - trainerslidein BS_ATTACKER + trainerslidein BS_OPPONENT1 waitstate printstring STRINGID_TRAINER1WINTEXT jumpifbattletype BATTLE_TYPE_TOWER_LINK_MULTI, BattleScript_LocalBattleLostDoTrainer2WinText jumpifnotbattletype BATTLE_TYPE_TWO_OPPONENTS, BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostDoTrainer2WinText:: - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate - trainerslidein BS_FAINTED + trainerslidein BS_OPPONENT2 waitstate printstring STRINGID_TRAINER2WINTEXT BattleScript_LocalBattleLostEnd_:: @@ -5680,12 +5680,12 @@ BattleScript_FrontierLinkBattleLost:: waitstate returnopponentmon2toball BS_ATTACKER waitstate - trainerslidein BS_ATTACKER + trainerslidein BS_OPPONENT1 waitstate printstring STRINGID_TRAINER1WINTEXT - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate - trainerslidein BS_FAINTED + trainerslidein BS_OPPONENT2 waitstate printstring STRINGID_TRAINER2WINTEXT jumpifbattletype BATTLE_TYPE_RECORDED, BattleScript_FrontierLinkBattleLostEnd @@ -5708,12 +5708,12 @@ BattleScript_TowerLinkBattleWon:: playtrainerdefeatbgm BS_ATTACKER printstring STRINGID_BATTLEEND waitmessage B_WAIT_TIME_LONG - trainerslidein BS_ATTACKER + trainerslidein BS_OPPONENT1 waitstate printstring STRINGID_TRAINER1LOSETEXT - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate - trainerslidein BS_FAINTED + trainerslidein BS_OPPONENT2 waitstate printstring STRINGID_TRAINER2LOSETEXT jumpifbattletype BATTLE_TYPE_RECORDED, BattleScript_TowerLinkBattleWonEnd @@ -5730,13 +5730,13 @@ BattleScript_FrontierTrainerBattleWon:: BattleScript_FrontierTrainerBattleWon_TwoDefeated: printstring STRINGID_TWOENEMIESDEFEATED BattleScript_FrontierTrainerBattleWon_LoseTexts: - trainerslidein BS_ATTACKER + trainerslidein BS_OPPONENT1 waitstate printstring STRINGID_TRAINER1LOSETEXT jumpifnotbattletype BATTLE_TYPE_TWO_OPPONENTS, BattleScript_TryPickUpItems - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate - trainerslidein BS_FAINTED + trainerslidein BS_OPPONENT2 waitstate printstring STRINGID_TRAINER2LOSETEXT BattleScript_TryPickUpItems: diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 7fe22195c8..be6c04e32e 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -238,7 +238,7 @@ BattleScript_ActionWallyThrow: waitmessage B_WAIT_TIME_LONG returnatktoball waitstate - trainerslidein BS_TARGET + trainerslidein BS_PLAYER1 waitstate printstring STRINGID_YOUTHROWABALLNOWRIGHT waitmessage B_WAIT_TIME_LONG @@ -246,10 +246,10 @@ BattleScript_ActionWallyThrow: BattleScript_TrainerASlideMsgRet:: handletrainerslidemsg BS_SCRIPTING, 0 - trainerslidein B_POSITION_OPPONENT_LEFT + trainerslidein BS_OPPONENT1 handletrainerslidemsg BS_SCRIPTING, 1 waitstate - trainerslideout B_POSITION_OPPONENT_LEFT + trainerslideout BS_OPPONENT1 waitstate handletrainerslidemsg BS_SCRIPTING, 2 return @@ -260,10 +260,10 @@ BattleScript_TrainerASlideMsgEnd2:: BattleScript_TrainerBSlideMsgRet:: handletrainerslidemsg BS_SCRIPTING, 0 - trainerslidein B_POSITION_OPPONENT_RIGHT + trainerslidein BS_OPPONENT2 handletrainerslidemsg BS_SCRIPTING, 1 waitstate - trainerslideout B_POSITION_OPPONENT_RIGHT + trainerslideout BS_OPPONENT2 waitstate handletrainerslidemsg BS_SCRIPTING, 2 return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 13795ee61c..faa383f7ef 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7439,9 +7439,9 @@ static void Cmd_switchineffects(void) static void Cmd_trainerslidein(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 position); - u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 battler = GetBattlerForBattleScript(cmd->position); BtlController_EmitTrainerSlide(battler, BUFFER_A); MarkBattlerForControllerExec(battler); From 5089b1d0b41c89985181df35be80ae36d2bf1329 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:52:26 +0200 Subject: [PATCH 09/52] Adds callnative for soundproofcheck to addtionally check the flag (#5301) * Adds callnative for soundproofcheck to addtionally check the flag * rename callnative, include parish song and missing ability recording --- asm/macros/battle_script.inc | 6 ++++++ data/battle_scripts_1.s | 4 ++-- src/battle_script_commands.c | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index f91313cb92..c9f9b28bef 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1679,6 +1679,12 @@ .4byte \failInstr .endm + .macro jumpifblockedbysoundproof battler:req, failInstr:req + callnative BS_JumpIfBlockedBySoundproof + .byte \battler + .4byte \failInstr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f9bb4565f0..c24dacb5c4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -508,7 +508,7 @@ BattleScript_EffectAttackUpUserAlly_TryAlly: BattleScript_EffectAttackUpUserAlly_End: goto BattleScript_MoveEnd BattleScript_EffectAttackUpUserAlly_TryAlly_: - jumpifability BS_ATTACKER_PARTNER, ABILITY_SOUNDPROOF, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked + jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked setstatchanger STAT_ATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAlly_AllyAnim @@ -4281,7 +4281,7 @@ BattleScript_EffectPerishSong:: waitmessage B_WAIT_TIME_LONG setbyte gBattlerTarget, 0 BattleScript_PerishSongLoop:: - jumpifability BS_TARGET, ABILITY_SOUNDPROOF, BattleScript_PerishSongBlocked + jumpifblockedbysoundproof BS_TARGET, BattleScript_PerishSongBlocked jumpifpranksterblocked BS_TARGET, BattleScript_PerishSongNotAffected BattleScript_PerishSongLoopIncrement:: addbyte gBattlerTarget, 1 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index faa383f7ef..d4afe23be4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17218,3 +17218,20 @@ void BS_TryTarShot(void) gBattlescriptCurrInstr = cmd->nextInstr; } } + +void BS_JumpIfBlockedBySoundproof(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (gMovesInfo[gCurrentMove].soundMove && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF) + { + gLastUsedAbility = ABILITY_SOUNDPROOF; + gBattlescriptCurrInstr = cmd->jumpInstr; + RecordAbilityBattle(battler, gLastUsedAbility); + gBattlerAbility = battler; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} From dc2bbe0448c49f36af62e4b4c96e7c388ffb4c6b Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 9 Sep 2024 14:34:21 +0200 Subject: [PATCH 10/52] Fixed loading into the wrong version of a map after saving in areas with multiple layouts (#5347) Co-authored-by: Hedara --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index a9606578dc..37a9642e28 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -624,7 +624,7 @@ static void LoadCurrentMapData(void) static void LoadSaveblockMapHeader(void) { gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); - gMapHeader.mapLayout = GetMapLayout(gMapHeader.mapLayoutId); + gMapHeader.mapLayout = GetMapLayout(gSaveBlock1Ptr->mapLayoutId); } static void SetPlayerCoordsFromWarp(void) From 389e5c20dd9f4ba0d551a18ab0f50bab61f5fb88 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:40:56 +0200 Subject: [PATCH 11/52] Fixes berries missing timing (#5300) * Fixes berries missing timing * salac berry test --- src/battle_util.c | 10 ++++++++++ test/battle/hold_effect/restore_hp.c | 29 ++++++++++++++++++++++++++++ test/battle/hold_effect/speed_up.c | 19 ++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 test/battle/hold_effect/restore_hp.c diff --git a/src/battle_util.c b/src/battle_util.c index 48aba80c63..f6c577a31c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2321,6 +2321,7 @@ enum ENDTURN_DYNAMAX, ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE, ENDTURN_SEA_OF_FIRE_DAMAGE, + ENDTURN_ITEMS3, ENDTURN_BATTLER_COUNT }; @@ -2453,6 +2454,15 @@ u8 DoBattlerEndTurnEffects(void) effect++; gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_ITEMS3: // berry effects + if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES + || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + { + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_ORBS: if (IsBattlerAlive(battler) && ItemBattleEffects(ITEMEFFECT_ORBS, battler, FALSE)) effect++; diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c new file mode 100644 index 0000000000..09daecc860 --- /dev/null +++ b/test/battle/hold_effect/restore_hp.c @@ -0,0 +1,29 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing") +{ + u16 item; + + PARAMETRIZE { item = ITEM_BERRY_JUICE; } + PARAMETRIZE { item = ITEM_ORAN_BERRY; } + PARAMETRIZE { item = ITEM_SITRUS_BERRY; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FIRE_PLEDGE, target: opponentRight); MOVE(playerRight, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerRight); + MESSAGE("A sea of fire enveloped the opposing team!"); + MESSAGE("The opposing Foe Wynaut was hurt by the sea of fire!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("The opposing Foe Wobbuffet was hurt by the sea of fire!"); + } +} diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index 438ff0d3cc..c6ddc19d8d 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -68,3 +68,22 @@ SINGLE_BATTLE_TEST("Salac Berry raises Speed by one stage when HP drops to 1/4 o EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); } } + +DOUBLE_BATTLE_TEST("Salac Berry does not miss timing miss timing") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(26); Item(ITEM_SALAC_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FIRE_PLEDGE, target: opponentRight); MOVE(playerRight, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerRight); + MESSAGE("A sea of fire enveloped the opposing team!"); + MESSAGE("The opposing Foe Wynaut was hurt by the sea of fire!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("Using Salac Berry, the Speed of Foe Wynaut rose!"); + MESSAGE("The opposing Foe Wobbuffet was hurt by the sea of fire!"); + } +} From 60803cdba9fc1b6030e454bd3a88adc158da046a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 9 Sep 2024 13:58:23 -0300 Subject: [PATCH 12/52] 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 36ff435ab69e393df93c3e0c01715b9ab500fbff Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 9 Sep 2024 21:03:52 +0200 Subject: [PATCH 13/52] Liam follower fixes (#5334) * Fix Blinking on Meganium South Sprite * Fixes Lediba and Ledian Blinking * Fixes two blinking spots on spinerak * Crobat Eye and Igglibuff butt vlinking fix * More blinking follower fixes flaaffy xatu hoppip line * Blinking Gen 2 Fixes Mantine Miltank Raikou yanma wooper skarmory * Gen 4 Fixes + donphan and espeon prinplup starraptor shieldon roserade ambipom mamoswine Stunky Donphan - gen 2 fix Espion - noticed a flickering pixel on south walk * Synchronization with Cafeei * Messed up the merge, fixing now * Added mantine --------- Co-authored-by: Liamjd14 Co-authored-by: Hedara --- graphics/pokemon/ambipom/overworld.png | Bin 1257 -> 1286 bytes graphics/pokemon/crobat/overworld.png | Bin 1148 -> 1053 bytes graphics/pokemon/donphan/overworld.png | Bin 842 -> 836 bytes graphics/pokemon/flygon/overworld.png | Bin 1068 -> 1064 bytes graphics/pokemon/grovyle/overworld.png | Bin 700 -> 722 bytes graphics/pokemon/igglybuff/overworld.png | Bin 614 -> 452 bytes graphics/pokemon/ledian/overworld.png | Bin 1152 -> 1019 bytes graphics/pokemon/ledyba/overworld.png | Bin 1166 -> 1032 bytes graphics/pokemon/mantine/overworld.png | Bin 1162 -> 1008 bytes graphics/pokemon/marshtomp/overworld.png | Bin 578 -> 601 bytes graphics/pokemon/meganium/overworld.png | Bin 1039 -> 939 bytes graphics/pokemon/mightyena/overworld.png | Bin 912 -> 903 bytes graphics/pokemon/miltank/overworld.png | Bin 980 -> 842 bytes graphics/pokemon/prinplup/overworld.png | Bin 690 -> 712 bytes graphics/pokemon/raikou/overworld.png | Bin 1210 -> 1116 bytes graphics/pokemon/roserade/overworld.png | Bin 840 -> 841 bytes graphics/pokemon/skarmory/overworld.png | Bin 1197 -> 1123 bytes graphics/pokemon/skiploom/overworld.png | Bin 730 -> 550 bytes graphics/pokemon/spinarak/overworld.png | Bin 824 -> 714 bytes graphics/pokemon/stunky/overworld.png | Bin 691 -> 685 bytes graphics/pokemon/torkoal/overworld.png | Bin 811 -> 825 bytes graphics/pokemon/wooper/overworld.png | Bin 509 -> 488 bytes graphics/pokemon/xatu/overworld.png | Bin 864 -> 743 bytes graphics/pokemon/yanma/overworld.png | Bin 1019 -> 1015 bytes 24 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/ambipom/overworld.png b/graphics/pokemon/ambipom/overworld.png index af46949aaadcd4471fce18fb4da632e7cb895f60..1f47b4d3e17c466c3d7fd260fde1dddf86030138 100644 GIT binary patch delta 767 zcmV0Dy!50Qvv`0D$NK0Cg__0P0@=06Lcd02gq4 z6}kZc001qKGBE_`B^DQvY99eiv5Kq#e?dJ)DMi)qMZoHOLg*2q>z*8OB?KTm6CtBZ zeHaZ2AQ_^4mQtp_6jvIa`}FYE@;bC4qY<<^f-M4Egw6OCLFJ=;Pg^8m19bd@PV*nA zl#UBTfD|OD6Wr(y91dgPS+5ba`n?D^y+x247DdWb0UQmCI@^m7tU=o03`igPf5YAG zK=|)^lO;@gun>-bgTX;Rhn>~=xWY{Uoxa1qJAPWDbxk`hFqur$p>Ni}s}4+)Qol_a z0joi)pM8%pAZrK@fJQI%!MqJszz~Qo)AoBX@Ssx%OS%i51l<&YyN;!(FyJnZ=w}XS z^^IS1f-}H`DSR#-dVN9?zHT7TfAnSmGfz@xs?w;BO9#v_)0d15aKCtyQe~L}TAga> zSilM(O;ZZj4+i{kg~XF*47}@n6YPXJ%fqSy;*;JZL>JX%odQ~Y(dUF;0$zj*Xsvd* zRJ3LEMK4ngSrKz}W(>aQM0h~~T&93V2To@zV10_Y)W^?teIiPD^JqZJe_PWRqnF|Q zoRU_bLC%2JhZ_*#C+4+2?M`KnugIu!f!egZh^!#l!2$d3Y9U6~=8EB7b_Jt~chq|t>CrE$EAITt~mB-PcR znITyoY&V!Cdk&Id7<29Ok>MX|weO xS-%%RUjA41;ZFZf`_1vczV!F`Rp8$?wx4^jJ>2u<-$(!e002ovPDHLkV1oJ&USt3O delta 738 zcmV<80v-K^3h4=uBn|;{Qb$4nuFf3k0000mkx?-R00027v<;t;h93b-v8Jp6f5A2$ zRlgSjtMdt=M~JR_a>SJofbdL&j4t(IG$?>%i1t}Znf_8-X?X6_!&}Si(29&k(CP@b z2yhWL<68ukkM=!nk%SG<@eex9f1px2E)W4ykfcseX@@f)edrH&f4c+Wzw1qwFzLZUI06m^2mKs&R_EgiHvx3|4*Tx- zX^qx3?X)> zP8}@iE_f1jQv~ihmZHLdyEvksIiS@ye$5Ha028M0xp?UH2}$_6fjrZje*w%qNtvli zqdqPjFvCn=GB&{d;!R4GWeR9@s-a^6D}XdjDO^7o@W&MrPo6RGuJcW>6Xq-rs|tuu zdXErYRF`!MX!S*(6MhMJ5iX#$+Tl{smeCizOf_Uh%+;AO_@Wcx1qE=K0va7SovncN zDdtiiKiBn%DB;bc0WEJ$e_xDVhST^gtv-XC0k01?Ai__~YkkPy0Id%6I_&~u- zs~}BYEXK>1T|kGV@mp;k^-735R&-o^1o`q+xBhe}_UHWsaMXu)gn^JB1+uy_Lo`?J zQ3!fe8W%~U3n5D5co%anf;>s8t3fkEvOL&sHv1(54=w&M-F3Cdf7OudTb^3XRR=)( zs>lwQ8~JS&pChO`pXmANoD<#vIaKA=DNp$2j>H!N5jwnPvFbT{jqFM3NAZVTd0Yfh z5~e!u-q>pgyf~DU`PeR>3^uIv~djp8;k6=q`Q4 zUv&BW+8Tqo=cUjYB>kG1eFMz!Kuk6E}{+;%l<9~hW@AIp`zin(k0k}^+ U&O|5Dy8r+H07*qoM6N<$f-yi?4*&oF diff --git a/graphics/pokemon/crobat/overworld.png b/graphics/pokemon/crobat/overworld.png index 28add5ba23cad0af04eb10ddcb8ca0ecc4d09b41..9fbaaf7e4286ae434f5784a0ca99214d652cda75 100644 GIT binary patch delta 951 zcmV;o14#V*2%QL!7zqdi0001UMu)eNF&hyt008P=0026d000+od=l&HdQ(8`07|U@xb_3d*q11afYm<|u=q#(3aI>E0H?IL;?{kdtRf_@UuJ(Rz+~(R zFJmo3!L&1j&EnlZ;8#FA2vGI8K`OX*Pf3h8a%cgdn`_CB!f*lLBB0bzKrNpVFaZx4 zgmd~x0PX^My7v(C)(BYbTLie0Xs#ztprsFKz52_X9sp(bq6wfi#PVriHUX(gWPnG{ z(Ff>*YrSh}yX+KTi$D@e9(;d_u$4+&$ES~wQLq5Y1Ox&mfbE|553#>Vls9e%d%dOg z1vu?=Z%cV&jh&Cf@5N3wWtesdw(kiT^KRx2jGD}E%HMFTqz|m&7cWF zF1jfVyKG)t5U%koP>z2xEuk?g)@2tO12Hq~bku`B4!V*9{>q3_e5xsuI8O!hFi6V~ zcSbSyzl2tuHlB7szn=}jbd*57Ln&9dT|iyF?QrN$1$us1_cGke`nJzSBL*1c0RuAq zF^#yNA`|Kg#cKifRG{aFO@Of*0gg3%$X6-&LIDfVWb*<}{WpK&kIv@wbcx~sKVUry zNG}BtXBoM6?s5OtFyhx$aO)>$T({j1rg42FfE36aoLYDQ4Eb5XT>b|;7#Rcu0002CwraKj000DMK}|sb0I`n?{9y%=AsZ1e008P>0026e z000+ooVrmwkxeii0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt2zNXnvyplqe>_Pxq8KcHLwLH}is;-_Of zZP21q86ft{qu%FuI!Y$w|M=sCR>uL- z5Dsx|ALmQR4W@h7l{_3=>N)6fpmN71xyS;ccG<@7ffLz2{Pyj_iLM4>_>gNXS7K~Og9vpV!!O(~% z-XSVCQyS}9p@9HEgUa0x<~3mv;Nl73;v_fJ<2C}s6j;GLLd3~_$}AV5}d$~>SHpw6+T=N#Z{a5VLxnb9u4 z(Gn#Vy>b49O$BUPe^qXX`-=c|kI2FUNZG;pS5OZ^`QGLF@*7kST89PFpkHOqd_g8x z(rVVI%utQn>v&6E-$TVsIw+m|0&hO^bzHEudXtXL)}VhE)Z|85&D#LjprLG%-}Z8* zLFET=YaYLw=ug$4JC((8#Q0_+tscQTGYtE);}b@)@L8M5f47g1CThV4%|)1@8n4hg zsKrKE4ZY3`jZSv-hr}?X1nB}7EW!#tW~J5S)aO72$1QZi?-?)NqTY5UU4F>+yU0izk5gU6^k?!0W;TLf&|uljpTA^bUY#0H5Kopq!_t`luaVOyR-nK92xS zb^-K)%G6ja`zYr(X;r%*Pe+;ccX&Y^0+=hBcW!1df6q!eIt0k#**m=OPxn|Oja|mb z{-E=95+C<-ppeBk*;$H(@S5Xm=+G8uo^*KtkpJ)~pZg&;Kn{#PH(0+s{;$VRNS2oG z6z!!l0000bbVXQnWMOn=I%9HWVRU5xGB7eSEif@HF)~y#GCDIgIxsjZFgQ9eF#U>q zApigXIwf>PSaf7zbY(hiZ)9m^c>ppnGBPbNF)cANR5CI;Gc`IeI4dwXIxsMd*TbCv O0000vI diff --git a/graphics/pokemon/donphan/overworld.png b/graphics/pokemon/donphan/overworld.png index 93f70fbda7b2c1b87eacb19f0a8bcbddbdc15d3d..b0b62b3b39ac5aeac61fbefb9a9cccfbb968f5b7 100644 GIT binary patch delta 20 ccmX@bc7$z00HfB#Ks}b)7d5Xob{=E`08%grf&c&j delta 26 ecmX@Yc8YC60HeXgKs_!7Fetst7Q3kC;&ObL=7G5R}-0%;F=RRid za$SL@3Ap9tKH{jcPdN0=BRJ(BPT;gaiN+zmi^dJG1vV+1!h5au$)cSINivw8Jt~IOfcMa_Y+pr4M1n`^hnL4lfI58}RE4S&p&| zyc}^B@4cwLWm(mf^TV3zH7efgw}~B?#^0OqHAlR<3?YOZf^`dl5y5_ul2`gwmKQR4 zCXu$Ls$a>w*erW&oQh*_-HK&O4hP!|A%;5aj~DGDdd&@u{*t%)WAqYtfl+*nod zfh)f60gmCnEq-+?B6XAV-AbgtV-}oc zDHpPo5(97XnQG!OeqC!6A^^cGE8qj@T`3;DM$$BFcE^p+;cG(V_8>_=kU@ z{xu4+{vZXnGHMjiDXzUm(mT`z?UMIsgCw07*qoM6N<$f-efds{jB1 delta 906 zcmV;519kkU2&@Q@PysNJQ85Pq000cWh-i_99~o~+L_t(oh3%KwlH(u@MI&TkhLHaM z&z&ogz8inThu-1ZJRdpdzhhYCM*o<9GWNHOoa1GxVaCa^n|mv+S{P5XauS70Z-d9c(kCF~qPxUeHHy%?*wIlDGO}^b&W0QGAS@ z2Xue(D+hu{lrazL$Hzv0&4rr`nS|(Bvu*-`bdJV_ikErO(XsHr^s5Ix)DG;ta{#-; z!lF#|YtM3Q%^{@9P!8c5+4Iw5i}@$M*;=&+6))R^>5VZ+zDmf~T0cBUxjl6W;FT<* z(3i3Uu^QX+(!s3+qIw|sDylzjHE>R%rFnmFk#c%DJV?62uD?#8h?Qvh4f$u2M;KwQiF;MFbGT#h;Jfo2je;i{)|^15W*sn z$ONWf=R~+~j<>66x=l z1!q~xg)F7S&sTgsnYQ1B0MmbP^Pp332&A^%^ot7D*e!100n!^a%KFeljlhm;hsHzV zAO4B>YZPStK?-hV)F_}+U^O0F%#MFQaT>g+4^--=o`ZE2X?XOG8`F|p>IF8uf1col z6C#|rag1#T3hpL5r-!vPciK&$bM-l?_Yd8)l<+)^@@H_Z()xB{J%3*M!h>@*F<(6J zG`uqnT}la$Jj3V3jbFdi;{Y;&sc~RCHkFf0ZsT^UwhC}Isy-S$PTp}$O}bXjHNNA- zSzx;dPOdq^zv)Y*^>~-#jpH$UXS?CpWLibz_W@EL$9!L9>cE^kr=PLiaER{#J2 diff --git a/graphics/pokemon/grovyle/overworld.png b/graphics/pokemon/grovyle/overworld.png index 92705c00fe9d213f51aa4b469d76dcd3f5aae7c4..96dc7812fa96aae0df5b501d1772252ac281f284 100644 GIT binary patch delta 64 zcmdnPdWm&{impPkN02WALzNl>LqiJ#!!HIP{epp^RG)$2RXhWO)pQ01@q!xBU5r2p S^@&E>EMmEO=Qd^qF#!M{U=V@; delta 42 scmcb_x`%aw3Lj%}kh>GZx^prw85kH0CI)Kr0%-_vl`Gi1u_1^F0QN=-fB*mh diff --git a/graphics/pokemon/igglybuff/overworld.png b/graphics/pokemon/igglybuff/overworld.png index ab5af8ee16e16d6e8446965863c368ca0368af96..ab6af8a03cd7bfda87d02473a6a4cc278273e505 100644 GIT binary patch delta 371 zcmV-(0gV3U1jGZ77#0Wv0001UMu)cm0004VQb$4nuFf3kkzFm3svLhfNkl_r((S@W6}|Y5?E_RvOG%|tsZ=VJN~QjZ0N^kAYWo6+ z7+D_XtL=4z&EZ=f=OLZp#K`1s@@ZZ`VYtB&M zu6Dp1H#%GwjLrsc+)4o0`ycgYz?ka^@3Je^)d_fU=Zbs8_HEW*+z#0LbI5@_UV!Re znYgWXz!xWzAFaE*4W4r9>#l^NeEJx5`F(=-7<>Z{0v_DIfbvf|LlK9I_~&=4cVCqN z2Y&^GC~5#AK*9VrAb=B=)%uAB6C+Y@)hBuT3NL&pI&k(W)G zlfha*bz+2ky{4y&V~EG`w^#P(9WoGL`|$b1vn7!dwZ4MMhKUJll2@IxagtN=4=B^J zI+E|5q*9a~F((=>_MQ7FEImLDn zHnXEtCAiL(^XLX-Pkj`$dd9*N-a08~Bue|*YF{mEXP4k%Iaa^J_YTv?j1%vZ4%I4c zD|AkqH9h&W8Q-0n{Z3}J4KjCGY|Wp%*IgI2Y2o&rxAz-Px>xNAPU9R7+AJ|fx`~9Ge>4Bq`&sulSSvg;>y2>#kPj+^EUGDiB z#&r4btL>f~X|A8G{cm1`brO@xA7D_bmbgZgq$HN4S|t~y0x1R~10y3{14CUyqYxt_ xD`QhD150fK3o8SI=)VP1Q8eV{r(~v8LNzF3(V?~AgeFi2gQu&X%Q~loCIBFv&!YeU diff --git a/graphics/pokemon/ledian/overworld.png b/graphics/pokemon/ledian/overworld.png index 8ca49bef3b624fc6b648b7d7434043fa2b33965e..64cd573aef7af3776a97ed18a9e1f9c2cbee6be5 100644 GIT binary patch delta 904 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 delta 1050 zcmV+#1m*jP2#yJm7#Rcu0002CwraKj000DMK}|sb0I`n?{9y%=AsZ1e008P>0026e z000+ooVrmwkxe`u0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt2j_!5B9Vq4e?mz_K~zY` z?Ug@I+dvqHZIGN5=MMbsW4v8%-$OzO{mXI*1Lf0H4brt7k z5K{R99Vio0vm|U)hsIOawx6MQzB?O7q*7IN;}rwX+4uZ>@4ZqK<-YFgzW!tB!yXuh z_-Dj;_%}jzERK1}1HusmfBC}5Ol3{JT?_uA8e}F+m13Nd0fCTh5JI(@FOM-!L14kY%r?kW17WO1DH!Hap{XgFx-Ntn zB)EdYE!z-AU##k5jP>Xii_}tHP~xoXe7loD0F5seGt~l`u-X0`e^{fOtQN9Ts6z-# zQmCd1S;jda6Gm&rTf%_V!UBLLwvfOlIZ#b+Z>OlR-DHV6m}We^5acnTnTAkDLYRUO zQO>NxvM_4XFU*1|go5cS<$Ng!IM$5}{h~@TJBew4gS{l@iFVT#!ZpJ{La5Ta3YgxV z=*sL0EQLbBCWK%;f8aw*^rJlB^=WF@C2^9=frc^iSV&x90X9|f_M4x1aP5-rmaQF?}}Tw4KY9$ z5GJenlDLF`GXRA{;2gB};HuSff|fhDDH*dCX=v6WjmuB z(1sdEq}i;r)cgqim8S;ox0nG>2Iz+@;J#bIzSBP_&00&vH^M^$C6m#zsumG@QdcSp zM$C}U4tU-u{noKQXN_Yibpo*Ft00`05PfW*;(JlKhPgZ$sY_eKEuRfUkYazPgC7Bu zueQ7n0+t4%lu7J?fx?@L57mybhKaHfCj3tWsaP%FJFpp@{t>So7#_`a)05U?&8H6W zyuw(+1|W2C4)_b9StY9GhdHR^xB5Fi$Dnuyi@T_>oTx*-9I3H}d3)v}b(a5XYMA}i ze3gXkK%>{+LLDF}J#>|@fslVgXKDE`0jTLTI(OqKrU?!Plm;B}tpit-RhuEIMWK-^ zl;fe55|NWwR){(@6`wMQC^Qs#+{jZavtXP3499%s04kAA?e*bw>I`y;mK31mmJE2m z?;KmMG|=*80V(}OU{J{22l{)yUIrdlXL9}W2K zx`F7g6G$4#g!A%clL>z%(DS+kvewh6d>n#cxbT@F#f{L6=24$MuDr}&bqdw(j46@4R*S)fY1`H~{`FJb&x*r}6x~*I$P(PHib@ TSMABp00000NkvXXu0mjfKR&d9 delta 1046 zcmV+x1nK+m2Z{-h7#Rcu0002CwraKj000DMK}|sb0I`n?{9y%=AsZ1e008P>0026e z000+ooVrmwkxe`u0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt6k|Pn{E>zqe?Cb>K~zY` z?Uuc2+fWq8ue8X)i$(kZMntZYrh{w0KyaVHJRTD_hZOnt7_`Yzfb43&+o>SuFj7@DX9QwcCQw?y zHX%58_L|cD6DN$cfMQdePZa`Slwrhzq?EMPVd@SuNi50mW57|5f6@^NAy#cN#X7m) z<>?s##n?PAJ$Cw(c7xPo!%_eMNJJ@#_=OZ;KweP#CIY2U#SWp}FcFZ96}#g79|cZG zdEkJ1EUOw;9`U+6g7^4EMYfc%%&>7kHvL#7!H0r{x>Xkf1cx5K6ML9@EYl39BkZX9 za)2;pnc+d-^y99Uf3j@J-O4>~)9R?#p}zK*8D_}{I`jZ(1Y*hhyj;iI!(w}uH1h^9 z-%WMZV4K!Py&?5gi%!ac9zoa-L=OjRV9Q?ZzkHCm5#NBt`Ap{qI) z78q70*)>&eDA(vA0V4>}k$9=yQIGo5G2o^wD4A0JbhA;>f1dU`lvZ^?DX3YGP#BAX z>qpO4OU*84F0&F-Wk=|`~(=+YJlf_aOd7TSfoMqAr8!z8a z2I;56u=#Yz1)huC=e@`kKF%_{&R4=LmtTnEfxcu}f7ai#xdRT(A5g{F>@@q=A|Y^! z?h=_3PD?iDCFcby=q_Qo^B&FplQ0*4yyX138E)yuo!bPK9dLge_I(SWWZT?({00!& zTjYxIvV#Bs03~!qSaf7zbY(hYa%Ew3WdJfTGBPbNF)cANR5CI;Gc`IgFe@-PIxsMd zKr%Z3JOBVCbVXQnWMOn=I&E)cX=Zr0Dy!50Qvv`0D$NK0Cg__0P0@=06Lcd02gq4 z6}kZc001hHGA;xt)|CE{Y9D{1NklIT05>)unH-kX~i42#x$fXzPV+q1EVlUD2Hxfr11$FQiIIT6 z$YBsa-(iC@C-B5xio5y5ErWH=lC}g%>_y0P(!ew_T(!mjNb~u@f zyvY|B%%B+t7i0blTy}NwiHi0|+vFH*a75%#BuNR`4rp^C*dyxYC8vyglPQ>QyB61@ zMku9Vn{u|nliS0Qp^$&*#T$Qce|%PlA=+Dgi!&bYyk>pcon7SMp1~Lk70m8zqbK*? zWFauRgtt|&Ypin^Bw5#0kl!=_2Rrw+L7cTBMI2U~@hA6oa$1G4#=H)L#|qyJqQk<@ z8o|=qc%{HN6Fjmro?qM^uMt_hqaF6RV)i%;qIW3KJ<9;0kCi$C_bHs=+fCR)+{2DC wJfiN2RX+&0!e2o>=vqv3f=Y3hBZfY!A8|kx7P2C-Z2$lO07*qoM6N<$f^wAU@Bjb+ delta 510 zcmVgdhxrrP5XxeE-+IsjlATLcwU< z{ljcxHu(yjRzw_zuCA`GuCA`Gu3h1qoS-}0<{#@3&vF{av1YNwZyUJHDTc8Y(c%Lm z0e_Ky!ytaX!v<#-P+>2{(|q8T!8&IZBnTo}&hRuJSfUwpS9ycm{36jV#SBk#3y9IB zC%F8oXy9qCJ9X=;@@bln`R8f6!uJe%h5s$ETtJ=E49N@hCHD9KIy=L4bEtZOBjV_= z6c>4uPcWE36AVs;`A=}&bcqj?tv}W#$6$khBO-;YqB*2;K${c69??~vlO)`mM4@=# zXmLAggq$bvCjK@1I$)0v+7umUIFvd(7vpd`9 z!M!(G2#hY_Z57Hj);SE4F3Y0GUo-#*8~3(BoV6lF99Eq12lsYzT9mQIybgoM3SSLn zqQlD08o|<9d8NQO5hMBR@D`yk*7e+OMb=VF=@REj$t(e+vV067zqdi0001UMu)eNF&hyt008P=0026d000+od=j0w=b|Jzm)kVDZS+3wElMbw$b;lt>c#3|eMwzvHk7D7RED4Ge`Qry=9@TNDLYe2bBr0DwEkxV^?vA2QH$?DD`0 z*#Y@lD`0b$2yh$+fFRH1sE>W@N{)X$-X%^4Vw@hw=#Flh4~qxbfa+$Yj=ke7b z9UhNqQUPopKCnPRtlU$4I0!s^Pz8AW7Xieu)99K+k531I_2~jE9@9DWok?5+77uan z*%4p$`Or57iV9txhQc!`0T_Jh(-x4&hrkon1^llCVDogdm-$VgoMMl6f%$)OB>cN% zB>;!RRUf>}R-yjvT zq;A7HM}Zd>h|$%$D)cy6iD?{E804Su0;Q7S=gS-t7M9m{g4XI%B9GJfwPB6%s(>*z zAx59qSU<_Cm?MWrnk0!vXMun4vq~N(eQi$C*j9xekC~+L6d{>;xy(77?n<#cfLdBv zk1U6iz`0F;5`e`?U@5#rN>Ku^I9qoB1&622V#%_}(ZfDE>|%mEUU8m|oeqRa>hYVv z(z-xgZ9n!~i<7?nvtflBJxCcec^{p|JSav*oyE}#^(nb@ee12s;yiyxGX~d6R_Cz6 zyFlKhlBlpZ53bx7c#Z5WEBb97bIv$B8_raGlBST&Z|AHLfWcW{E0xMy=A{o_;TRmy z22p{YRsj!u_5Qa4pgN!Dxbz7DJn)A+^8Bi})yaoFZ();5XX#BG9TzJHCRP9&9T2q( z7#sF0JkpP5I_demmI8l3P$G8|HW8lMbkIdH{+ z_bBvGXzyZYP*>*gr~2JNrQa;%liuF;uk9PCR5PiSTwn$O000R9NkvXXu0mjfy!wfS delta 919 zcmV;I18DrK2agDl7#Rcu0002CwraKj000DMK}|sb0I`n?{9y%=AsZ1e008P>0026e z000+ooVrmwkxf4x0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt1qqE@4v~o;f51sZK~zY` z?bOd}6G0RQ@VAgT4rm{sGQJlbxC7RRk}Bd)fU=c;7df*&TrY*I&4Tf_=MgfI`8o z@cg@gVtC8CT{i@?vt=jHe{(UcncHF(;F>MY051n&1d|O@oI6wY9Te~C0u~ks>qL%? zxpAKF;6YFftttC9iKd`H8ghu(0LnpmF1&5Wc{T<25bxaJ$2t&el&7MZ$WHTZ3QCBj z+6}(3!E~{NcA{@nu!d_+fNS<#=d}~c(=&)ItJ=3NKoi)cEjJKfeq^Byx%zAiTgl)(Wq|yW{;L#77q3z!ug}mIxw~x zxMtnUJw#S|B|PJkWs+UYlgr4X@O}`TcB$ zVX8i5hMes1s?1&+-vB#ueYIa6raJTvDl(tkSPyq--$pXi*+*s5V~HYYw0Eu6#mS3JpcdzC3HntbYx+4WjbwdWNBu3 t05UK#GA%GMEip1wGBP?dH99agD=;`ZFfi=^qFn$0002ovPDHLkV1f=HrAPn( diff --git a/graphics/pokemon/mightyena/overworld.png b/graphics/pokemon/mightyena/overworld.png index 4dc936895da74afbdd91c48265b18d1ed63ebc2a..2765fd4fc05c62ca1e9a5ebd7a1030d71c6d5131 100644 GIT binary patch delta 20 bcmbQh-p)QDfKh#7pf*d$^~CQRJK325MXCn| delta 29 ecmZo?pTIsLfYD%Lpf)c9418RY`)OkXJ2L=h&If=1 diff --git a/graphics/pokemon/miltank/overworld.png b/graphics/pokemon/miltank/overworld.png index 351fc02f878fad696d6c4b818ea75be073cdbd14..1ade8435229a6ed1b9053bc1f205780f914a86ac 100644 GIT binary patch delta 723 zcmV;^0xbR12g(MJ7zqdi0001UMu)eNF&hyt008P=0026d000+od=zsCbE8!Xa{ z+|&XlTzw8GACbDq*~LnE>E1&=;ixW+iLFH<_|zpZ=id{$!HdAHTVGSYC~d8Fj>qOR zHs$8W?r^2Gb>)y+3TGT1)~*&_tF>(b6HZ@&okw)Uz2b>Wo!#K@fHb{XyJ>&O^f!2* zB9SOu=ZYtGu2)}EzIdzSO3vb#)~M|{g%3wwDF`k)$3L}14!3puiJ#+%Cl-P21DtW? z03lDIP;i3}hcZ#-%uiM1o%2pZqZn?_@%qSJwF6M-1_CEsndk@<8KN;rV2F+B*4k;3Xi%{JD>HrkJFLY0>N{W$HleU zsBp^5ILEUE*&yEM*m#5r7YE^|35a|Q*1uuihSm&6UgbwT_7rz5|6~gc;=(O zY~C0wAT{-21%-Bav5_ahQQX(98{hvk`Aer?P4U=2wLhRcC2PCr9#8-P002ovPDHLk FV1lJlTe$!L delta 860 zcmX@bc7=U{gd__y0|UdhZCTrZ6id3JuOkD)#(wTUiL4V9r3DQb7+xhXFj&oCU=S~u zvn$YMqOZLyW0JSK3quF1tOrmFdx@v7EBiA>UN&X%UnaV46FcSWTRmMILp+YZy=<6& z*+GQ;L-EZ+6JkW>W(u$LZC}PM#4XRDx%QM#Ys7k|=~1Tw(oY0-uGCW13!b(`T*+~! zkYGrvBTMPYNvBpuN@#o8F^Wn~+;D2+d753O2eeiE_LBbK^o24z`len{<3!YnjmU*FEoI;L^ zqT+<4rJd=EOc<;bql=PmNNEN*Wz19wQDb#F<&yfISB16mNn$qZBDZb3nX=0AKKEpYYg$If zUYYLC?>YNNH$#k@)ot$P^p%e<{5tp~>cCsE`mNGiZgDWBcOLw8HF*F3nm17eXENPx zzMLlEdE`P${B*N-M)g@zGSTgh^Xqq*I>!XN8N@sD$Ca$i-Pjnhzwo9$$Szpmz8CL$!}JIBXJqSBLU5?PQ-?CA;KLx5)2L4}bT6&R0^% zdi2HP*u>uY4azmQt=x}ZQ+UT-^!>yFIroE1bIrxY_dm&&_~`ze%d2tYKI2ms>5YxI z+iqBvH9Ks->pU~LTx3qM)Gp^Ak!L>aeco3fv}^xDlgHbhuPLy(d%EOKqJV_I^@its zNBOs?v{?T1)^(iWd*biUz#aDXlYak^$b9~4`G=0+ZQ&0c3f9&?(GPA8zJ2|t{&jiZ zJNBA9%yr7Zl&V_d8c~vxSdwa$T$Bo=7>o>zjC2hQbq$R|jEt;|O|6WKwGAw+3=H0Dy!50Qvv`0D$NK0Cg__0P0@=06Lcd02gq4 z6}kZc001hHGA;!Dgw;!tY9D_QNklyq0b423O_P!^N-f89#Ln>e)uS+{Bb z_{=z$`3~p^u#;uEbm`KiOP4PFB>})6@NXKqKFx)sl!gh%98v~EgdCVY&D9`^6HYj# zOjt@m%8C91mw=f>g9gT23l!BLz$dxn(<73@gflJ`zzRUHK%eGNQnG)9Q3Dgcpq$ad zMb0Rm;-tJNj~W#p*wuWZGM&qL?-qvxZ~a#z`nn> z&8Ilf7BD)2W4_R?K+u1{JYeY$8i#khao12;^VP6{2`6I}s=XgOz!zQvZgOkP__v{! zb#)WI!Le2@Tq`;S>^JnuT?6)ngYggUcF49%xYi(G=hf#{U-w8ZFTop}q(LoEk$%p_ z!8g6VSX_QWzV!xuj;$cG+$DNpX?Vc2TECrhU=MJ{O8jQF&u$hAA?6TpQ<0D@%z8m84efn|z5ceq%bNo}CGlt!7-gdN%__W+{?b3!FW&YY5T6pfhyVZp07*qoM6N<$ Ef&gA2A^-pY delta 623 zcmV-#0+9X41+oQ@Bn|;{Qb$4nuFf3k0000mkx?#x00000002sFYRUir01#tgPIdqQ z03ZMW03ZMW00000003gS?)m@#0u)I^K~z|U?UvDY;~)$~Es#)($^ZZEO2SRtwFIem z)4q7laoXk%Xav~qvRt}!>C&Z3m;RFg;2-!Wja={MLQ+b@gkugV10q5WOz-Au5XA{6 zoKhx#ETtgjM8Ci#U?$O^fic$tMKuWUPA>WMh~zNgj7tTu0uU_FyE&AUEMe5ZgfA#( zv~ZC#il;a!FUq3^h8$S9C>TBE60js-W=JJyV8+3gSUyj2$kv}U7~LUbE-S=0NeJo2 z!3xf}X0z)IhrYieKj4h_fFB9c$Dn~R*VO@kU8XafY-UU74xe#x)WY(B$i$_(6($_} z{@ONsXJpEOwt&$I9P@>C1>6QE9Qz}t1SLA&xNE4a`D)m}gp;uf)qWlm&N$llCb!0n ze;R68S2y7c9BbvmwW3qN-l0$K8n7oEjDK*qL$+PQwFUt@uRgc>x<_((30~kN4QhdZ ziu8Rh4!+6lB`It56Y{M$=yPlZndL6g3roWTrX45WP`d)$9=sh5YGEdspP~jDj~bLo zNoFwVuZIA%?D*mtG~l|f7SO@C<9INr=dMfB`*b_F_Xd4VBt_c2*@gP&-}npn43cYA zVL1ND4~C_00ZV}<|8oahU=2oG9N0`&!E<)maLnavO diff --git a/graphics/pokemon/raikou/overworld.png b/graphics/pokemon/raikou/overworld.png index 8936847f40555b74edf01630d394e1e823a4e8eb..2bad9c9b2a7b3e320a39e7f972c5d76120f24c50 100644 GIT binary patch delta 999 zcmVz1n^427i_QK|L)-}dYsu(c9kdSPkm5m6j75q&M~eMm}TZ9ZgS|G($LE2rcz;#XCo?f)c}9md`5L@ z2Po0m@ZRQL^{Ho7XavyY1D6(ALSUH*jS7JsuG-d>Pjd=&I4dOSgL9)sdVHYsRUi=Y zIZ66rhrc^W;?{gE1L$xsHwxrdfltO9X!GP2$w7VUGKU<+B{un6fP?ZRke5P0kBg>O z-}(BG!!I1)@2jM#uDecLB({I~DFPo<*?QM^2}KEXIQEI>R?XeI44}oeKA`WO6714K zxh#vc_$k1FN0gZ{3KYuBL(4^fo9ph5apjXsy)}oN0$LQD1AC`F9F&mTJWbu9zsjEm zDsT&;B_d%n188wn2zEMI@X&p(tPyaQu3B6<3k2$fr#&ZWo8mN$Szv#Szw{5>qt@^c zWLO?y`Y-kM_{{zy#6>Rh zQ?b>N<5$U|;Hay|7O{WIqsF(*8srLpA4Vof7h5a8T|O(1D@Ik78UZk_Y;ol= zrjb*9N#J&t*W;-Ngoy#d3n?zo3LQT0;<;7p(0bX60KoMqLW_b&IE_3ZQD1KI0oNWj z$kN)v`(^~t<*3m~PYL^Ga8XVJ@@wyL;EbibUBxlYQgYd|g)e_yXb-$8`(8rjd*;TE z5rEbu{<2e_9RMQ8-1-q{kDJE{s5r# VHPOYb#ODA2002ovPDHLkV1miM0026e z000+ooVrmwkxf4x0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt7y2|UMv;jhe``rZK~zY` z-PN&c+e#P!@GC(O$YKYnOD7-pZV+~+64c7W<1J@dpAxGvrU)rx2a{+Gl)N`})SzbR zB1-i#WXa$^z{|s1$a|CUR5Eo6rddpSvaOSJ&80)9_Jd&kKA*l%cV}G?`c2|VweqNc zI<|4`QUCM=a1~b`F;bgqfAcZ_D5@CC#YN#Q9gch#iT%R~)VHy0)PzQoGa8i|a9$<5 zLYr6t-KZ0h(MH?#)WW^Imm%vFkxflDJ5`;CEVZ3(&ubx(SJUnQ5n0i7-PAi3ku9&Q zYnDeuUKKQOM`Zcsp}FVeGveKLX~&M&6q&AB6G<4?D*`{Uc1C_Xf8P_%8{X>$mZJ0NIN!h{bM|Ey zCBivamXJIM5Bho8OTm{*|9Eh9mCPO9?2+F`aZotS%BC;+ z**}5f99oBNLJMAzhfL$Nzc<|L!wGuWoAVY#;I!_TRhK3*ZylX^&LE+2 z{h(>QgHwRh!HLkbHh8-U^I+C?t=%MhzKbyol0|ZzJSUl9K@-ne11Xs!>7EfuGwMa| zx5->p7lj7NEj3#Jv~}@rM$gMcz0ORZ!A(>)V5shre`3M3VVYyUPa9sb?>CkYG)Jf~ zfF6y5Bu@?RU@>C_dagr?1=H&^m*0O&iUrf_Ua`UOHXSPs=fx4j`@8@FR4kZYr#Tk% z=Vu7V)1o>-g(wy*70-JJklwHwU&zu+>H8wTWPAhvU)KrbcZpvB z001R)X+>CcWMOn=I%9HWVRU5xGB7eSEif@HF)~y#GCDIgIx;gWFgQ9eFukZKrT_o{ zC3HntbYx+4WjbwdWNBu305UK#GA%GMEip1wGBP?dH99ggD=;`ZFfh#ZkQx90002ov JPDHLkV1hLA@Gk%W diff --git a/graphics/pokemon/roserade/overworld.png b/graphics/pokemon/roserade/overworld.png index 6011e19040c8d4b2e95fd5d5d7d8ad28e16db7ae..f5aa7ddfeb6620ea4e2efdb84f2c57e11c09a137 100644 GIT binary patch delta 685 zcmV;e0#g0R2FV7HsDF$}L_t(oh3%Eywxb{ng#k&BderxS+u0lJ%te6|XVzSquC8jo z7}{U*7yO?D7-56^Kwgb9yGw%$7Wi;6xnHV0 z;>MVmyu`m;8Wpm*llWGMix6a*m%!{1_1)sNJjLa+Ko&0^)rCIsV*!gxtO7gwOkU!L zQXl%Y*B^0rZ4j=}(rd6PE8pOL-=WZHG29;K z>8JR4QlScreB1XaUXql`JMxDd0k@sI6bDV>9zBn;;MW|thZoJ{Sp@|y34hCrJ~kB_ zwYk46F3`7QlOQ_QSXV*8PMP4iJtcwV44))B6aJo;BoPzUL7Cba3^@Xdtc1e_@29~Nhl3!+|0n>oGeYk>Xx7S&lE>?LWLMGDDCjX4m5ael4K!o z4~fAYcW6SDF`*p~atK^IoG)lRn|WHc-y=LfF+SSlY!dj2cU=1|QF(?#M?aQu@>6Ip zLw@1X;Z%iVg1l1z#^(a<60;@xGdhGYNHXv!@+JoG9jIFXo15`%0pCb`?0?!XRrn)- TCA>T~00000NkvXXu0mjf<4sKE delta 684 zcmV;d0#p6T2FM1GsDFz|L_t(oh3%Eywxb{ng#k%`derxS+u0lJ%te7zXVzSquD04Q z4Ld)ebB{gt*kg}9_BK!Z3;s_6%&@_Ipp88&4u@q~rU9lL>LTLb4 zh;dM+ImeH|$8m`)?%vU3h+Pkhvp+S%h%$Er%sJyTcw~Zu^?#?F-KD_=3w*ek+%HWY zac4|SUgMuGoeEjpNqj5BMF?`4*TC!%_1)sFJk{m1Ko+ka&4oVkV*!gxYyt=ROkU%M zS|9rL*Pn5BZV;}~({FNV^I3Pwpv6=Ej^EOh&lxj$)OdO*_Q?&-*vsj1ho2+Xcd$4L zq)C-tii_Ten1B3ti^2_F59xN$*PZ^6fWfgsN;xYm=ahOQV)624#>x%ulnay;YLz-O zW^!F#uMB&=7S-$AX%VJbmyoLYxp1ZS2C=F`d&A{NCEKS1d*01)K z5`#PL(1a>uLI)n?5SRy?4`}?i@U-kdM|gf>e6-8iB=C%9T>mN2c!9$}KbCOvQ|Tx} zzTq<9RE1-Ld{6+!=K}o_vnBd7JA^PuGV!SLCMED4XjlN7oAGS{-$;Dyf7&l_nj?e? S)k1av0000EKgDgPHfC`ii|MH@kjpT%*&8v&Z*w{ejSej&rglEJ^|F$+3ADuV|YMFEmEVgV=- z@=s~Bpd z92Y>)VAVQ2EY5CqghsxpcBR)P2Td#>(4>v>_AKkRh5!CU~0->#D3Tr2L;o5PR ze~ix}usqyU>8H-%fIIqe=enXmz)j$X3a0CtoDA6TVZ6FKFa+5Uf|dTf9qFbvq} zCl`0+!vlz-rzOs_U5y!_9X}%Ud6fVKg(aZU&)!yAE{YV*ERO<}GST1R#XZkKgHSr_ zsYsf`m(yXx{yGIFhGqUnZ-7o<02#8vR|E2ZTwelIC=*KYLz2{ zcR`dE{9F7CF5toy_jcKBDtb_8eN``GwM1q@6rBqKlAj9rGuqA$7Hg7*OImlwr}{9W z2*HUR6nju%989(g%nX0S#Vw`nHuD}!3UBw0bC%3mXPopfuGDc{z41>SPon}n%iJnP zkexEk0sf`o o;cdJ7;p@5y!|&D%zwNKLKaKSm>VEnrXaE2J07*qoM6N<$f-n`{0RR91 delta 1090 zcmV-I1iky?2(1Z_7#Rcu0002CwraKj000DMK}|sb0I`n?{9y%=AsZ1e008P>0026e z000+ooVrmwkxerl0b)x>L;#2d9Y_EG00(qQO+^Rh0SyKt6k|Pn{E>Yhe`-lYK~zY` z?Uq4r+cp%(B?tz36eG1%k0$j2Bub9l-DGjdjxGYZ@Hw#Vj6AScBN*a)-~l=J((|?t zxJOB(sBCu7?l$zni1iEk-v5#BQMBXyu))wP{9nzTpJOlUzico(+H1__=h!1%P?o4? zM$Lreg~Mg`$b6a~83kFKe`trCB;PII!?xtrgnOIa#?|29aax}Xm|te5QVY31;X$Bb zJaN4H7MxbsJDq`I+d}^my9_qk<)y``8LaO})dlocbhkbu;O#H5iwU_;FpsiqWSzmR zsafpj`+X9U#YV3{@erzW@?>kC9m6{Q6#<*?MMkK_dg^s^8wc@ze@{cYX@&rvVqGqh zB@UDKiIXv+yR74J!cYyxDfr*BP*q8!f=-?z!Xlr#t=9Rr!spCm^8mT}_s7ln)ky0Jhk5)n^d6 z-kmz0of>m16s_q25GW$xC1$n&oR`!h1_CzQ6F2L1fB&@J+zwIQ!!kV>Un-Ge+>WCvmAeN zNkl^=H?|q2DdmG2d&q=_|`7yfHQG|`d8qNdm%umE~&J>aK0es_z1;3u38c${e z!L509!5E;!;lSYr&JK}9jt#OLYFvM90MNU}oyYeIfQNjQAL9- zi{ec!Nc-${jV^MebsFL_K`{tfdIP6iOu|~_bC3g@3^2wQKAhY1P+fu^CzE(>X{8l= zF7iT$w2bnFuNW=?Nw>Ji`JNT&w{V~H+`za4uW;FDDb)&Kl<0AJZ@~*(thM~Tz*`Z! gz!g3<_0RMLS)m;|IWbwH000UA07*qoM6N<$f^RR&UH||9 delta 617 zcmZ3+a*K6>gd__y0|UdhZCTrZ6id3JuOkD)#(wTUiL4V9r3DQb7+xhXFj&oCU=S~u zvn$YMqOX}OW0JSK3quF1tOrmFdx@v7EBiA>UN&W(g1{%MCN{{|Pw{kd4DmSr_L5bhvm$LAs5d%c~0&#F`Ii-yzKJA)y$QG*OnPxYz=&q=ThEuTzthZ-ajF>mqq$! zeHYqolDXsU@%iQD{RbjKf#B-@l~JqTgsuJg*zxApwAZWl)LEOX^v$!}d#U*!bLrip z9hJU$yl!*$1U&y$e0(8$Mg8`a><<~!`BxO@elXb@`)Oa}GUnaWB4YTUpn> zZy|HrUGuwBcR#$Tzxdyi>uIII*KemJpLLwfI5F|YwnF)5-!4pxzu_|blZ-kaj~|;E z%l4Q}0xEm%7Aoq#v5X1OE}k=^;>9CrH-)gehpG(^@)!i3`7tqGIW=b^v&xI4`U8wX z3VjN*I}`YJ?{PF^o{_&#I)P8=#HT+w4TmaJ8&sG4+@r6)^Zw(foDW2DomYNj@#y7E zpTISrXU4;+T-i$J6mG9=IW&9iof{umc3beJruEj=+&M1KrLWNYB<q42`r6EUXL+ jrUs~dMA49&pOTqYiCe=He%?90KphO8u6{1-oD!M}+(Z6UMD&RB$dC9#5lz!{5%G>YKZn`3i+snQ%1yIsYRz!V=T)EbEbpDW8q(xG zAl!tI!Pkwy;NJU>IaY{Z7!~FzRQG@RiVMrTK&=uTI7V0eLDL~)X!v(t`t^J&by_9e zX0kWA<`RkARw3sq0o{QUMX`QyF7J?Q_;)VWKWKk{rS;{2#X-I1B23Zi6u7;QwSXti zBGw;y&OI`7toTpd`XS;m90S^Yyx{^dK>Fx%&W}5$GcV=`_1h8iET#X6PP_%~kqlbpV&_=P__hl>>^o-U^$rG3zCS{y!=3D*C2-qQOeU-v5Sye$k&V{0pX kU*+ohkM6s>cm17y0D6}hYsJo4u>b%707*qoM6N<$f<$K|YybcN delta 706 zcmX@bx`SUN&WpavO!s6WiqK8Q*xiIEHu}e|u%4 z-)#p8_7B?gCRp8wXiD*xWjX5n^oNe>b4C3FEGM{>g+k|;Iz9XBrIj*4B4ba1q~ofP zc}z#R^c~|`KHn_g=hnM9Y^r_g&!6&tYs)t_2iShS66|mL|6)zl!>P$zSG~2o8h2A( zX4|SglJj4O##J&fH#BQ8AE@7P=q3+u?M`{Pk)Bmb5$3H8}o4D9i|6%L#U-$R=1zR*5zp~nS_fW{1dJEpo z%GPtc_G~zD@iyOqFd5hQua|g_uDi>+o_n9^dGjB7I$ZLTPAhoS-RX|mapGe3AudL> zMFj_MSsNaH|1i_|=uX44Z@UhiOJxWwQ2ac9XSdA4^OFtC-WzNcSzbOR>L~Aqw{MSa z@IBHb@bKI1MHk9$&Xm`(+o>zjC2hQbq$R|jEt;|O|1+pv<)n*3=IBuRVzYt eKsDs%r(~v8;?~e}{qS6%1_n=8KbLh*2~7Z$1u?4t diff --git a/graphics/pokemon/stunky/overworld.png b/graphics/pokemon/stunky/overworld.png index fb36b0cb876312e96a79fa6c92162d614de444a7..350aac0b4d3b62ec26691b8d633e5d22d0fa7bcc 100644 GIT binary patch delta 20 ccmdnYx|Vf90HfB#Ks}adwYj%9c4{#J07sDq=>Px# delta 26 ecmZ3>x|wxC0HeXgKs_!7FkqFPAG@(xiwOW&A_f!y diff --git a/graphics/pokemon/torkoal/overworld.png b/graphics/pokemon/torkoal/overworld.png index c3a22a1fb0b5f4d6641a07880cbb96ce30023546..29cb8a45e1ac878ee00c0737d47a39466936248b 100644 GIT binary patch delta 708 zcmV;#0z3Vy2Dt{1BrPCgNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg__0P0@=06Lcd02gq4 z6}kZc001PBGAINF@=nu{Y99fJk%}RIZ7mPf2$gR@?y~;~=)|Jg-!MpIwbCyP&`rIG|7K63^b8Z#RS;|#b zH-YoaE_#)_z{~=fIn8KRm}TC7EWE-)aD!CmXl|#sIU4A5mYB~FCZ^1ix&%8M5(Ozm%)GQ(a;cIF)??!|;wBJzMikd4?3i&dFyu7I z*SfCiXD@PACSued0+}!UUT;U-)>ligO%$;dSIg{xv%#jf53hZo8o@q)cac$Dp_}BX zrsrK#pZgkZQ-w!stsZeR=y@r*X(ph@T_A_n6fW*j<*@7Pa-}<)Bv#@4q}ihZtHPbD zRviF)zLl6!>l<-XDC|UuFst1A93R*{t}!K6S+ao3r=9fM#CNl<{2}TV~rz%f@;0#uNy? z-C`kF1RtsM4mCy@)$*6G7FZ1Ke+g07Kxq=&^tJ@L!Hu_mzTG7y?5B-CK6{5YuIzMM qUi$gP3;gKR?!ULbr00(R82Gl{ny-9??#5mjihCY9?vK9n3jrmI*L?W=VkO|F@^TB z+xqDP{z(ZUnL;jcEGDg7xX!)LvMy|&Sst2sfAlxvA<)$}Lp0dXf6igzM7TkL4ylI9DlmS=|KAGrQ zf3WZh55Wymou_$SD+3*l2^0t}6OX~az+@{B01PuMZzU|`5;kgs)J)$d;9tW3nHKLj#g`n}(d zxb3f&U|T3+DXzBJ0cV3PZ=YU!Lp6haf9@iqx~s9V?s1JNvC4dxiI7U58T`SyppJ)?R0j7Xp>gJCzOZq2XrDHiBlTfyh*%%Hf1mji z*01=*A8O08Ak+fg;5TRQg8|JPk;Bp+=dV68+fiCJ&WAUaK=9)h3&A4zOr3YAG0Lo# zzkId8VsQUUh`I(!lh~oRCD09Sy!G|%DJfyUZT#`sJG60Sr`z(<*Dnt6qf@*8-ujZB dJN{$*1JsBiul*Fl_W%F@07*qo1w^hwV1hx*P#ypP diff --git a/graphics/pokemon/wooper/overworld.png b/graphics/pokemon/wooper/overworld.png index 28fd4df96c43383c3dbf6cad4beb96654c00dac9..471039362dee25ceb3b2c399afe60a337b53d573 100644 GIT binary patch delta 360 zcmV-u0hj*$1Ly;gPyrs1Q6dB=o0sB|i64JGNkljsZ=VJN~KbWO#jHQx8ImK_uR}$7Uc`xh_}rxoLFw= zSKFI`ISh&AZY~%vc`U$-05@`3l&^SiUHReo!D=_>`Afjl{1?{6{-?Zu*`;A3jhlbd zob*`XG>?G(d^-1Z1CZN8CDkD^)cQ{+u;QW-@iX3Rf0l9bY~JKCWQ%C+X9IrWlC%(5 zZ*`atr(L?tyB|C;gh_oqxg)sfbch!4yMA8kM<4KbO^J4uZ22D!deAUY?%26bx&J)UA$^9~zuwD=xKuKO=8Hz71r zwKz{I_4i@dRU)gY>xb4Z!dw8VC zc>k<>JZBO;bjphlR-C;1VM5KJmk(YtF-&*;(e?e>%>6RA`|r+quFpE}nSX@%>-nGl zom#pE57uYb9tr6i{F=bF6VBzV>UIU{Y1cN`?m+Wy4^bGe@uJ5SxUY7vs%Ae zbmz3XYY)WrJh>V_inaeNxV6;({)Y5<5{H)Dn}0_zrsS53_6PGixmSz%D{7Xx?DqQh zgPq+nV}?fgo0#Qy?(^qQTvGpd#`~YT<{B4%9^l>}=^xHzv%|-}&7@`@dxh1_AI$e^ z*mP|-L=?BhW^i|GV*0LhFtMeK*F;(49`~1j+!_<^FbGxf)kHv_#`HjYNfWs>Yr3FiAe|zSOT= zsiy$}X&e1zA}Lo|I0yA<7$)@wNWzZm_Qjt#)JKT(6($S@dlLf+gselJN=SQ$$0TXw zGz)Iea~kSddJA(!<^So%?^366#3^ z#VhJ5&5#Cx!(LhsjvtPk@hVeDI3{?sCz3Q9WXMJAW)r$Q_vw6ihoEm}gh2<`eQXdW zT)EV1`*`DV;522&a|J9Ja(F`Eh8;EO62gRgp3a9`_E?`TAxi7D0e~#8r=+q7cU)7T z0XwJbuoMPG9eaGowOvXB$31_>T0Nfqj_2-VMrP~p6C84STtr0EpL9SR9BSh|B1-cL*P=XlUR&#}pI z`ZD8?o^^p5H~kW&uM!m=^w0B#ae~jxxRkzcZ=Ch|b%_-Jp;@_FAN50z>T7%n_M>ia z^t|RA)+0}?hwf3m?2?$G)6gMgl=#lbSKj}@`g+QUN&W}nMRKDCw9u$3wpXZhIkx*d&w~S zwu1=!hj2cV(iIEmJAAwL^h4yPha%3a7YBcMwDO8TbF=tF&DOdGk*rrx67U? z_Qu^PtL3oB92#GROWTo~(Vlbb^2UN#V_F7d&+TRrBFX<&>uxCcjRI?<$GdGJC%K27UP% zv-3UHzU7x(e2drl;li?m(#NC~--_Qof6o2v#TN!A%pz89y_1|H)e?~_!`&a+cTc!J zaS7X$DnzOe= zZL|KNFv(wrza>*geqx+$oT}&Z>wPv2j{;^KdnL{&bZi0JlFf{(-=DKueYa6nJZkw$ z@k<=b-HPN^+U#$bdsc$YRH64%qu9@XJu*+<8`PJ66I*DSoMV38Gi#FRi=(gS{kyw- z+m^=1RbN9n(z;uv-^l)-^Fn+I@3~#C-;|zxCeQj`=SM_ z!kaa9ixOf;$`t`Q|Ei6yC4 z$wjF^iowXh$Vk_~P}k5X#K_3X*wo6yy*=T4Y~O#nQ4`{H55`meT diff --git a/graphics/pokemon/yanma/overworld.png b/graphics/pokemon/yanma/overworld.png index bc4288ef4b9849680ed98a6ca6767846f26a7ec9..fbd1be82bdf4d42c2cf5af4a27f65ae288077d47 100644 GIT binary patch delta 876 zcmV-y1C#vw2loe%PysEGQ85G(A&>x(i64JGNklDPcO*eD zP>j=b9<5c9HoGzB2yr`(C!ToXi6@?DAq4$=$))Vye$P1oO8YK^5*pi=TpDey)#lQ` z4W|I-fZC^uhtOJs4<7LSJ8pak!J9R`=LhR|+2TM_qqvED=qD$|t?TVzBV@gDwG(W1xr`R`z3VJpU*$ zt!aLcM1=<4<)9b58==Obbcn{mV}?D@K(eH_22#jl#GJ>cS6J=FDlpFWOBb;jh%gV3 zrqzK93=5^^S6eMEI1C)BTIZzXF_w}RWA+56em8K}IcNzGEKtn$TLP+q$$o#;SA&)~ zU2`7ZTh5;I)9Hy&W(w{!&^{~uE8yrjg=+R{0+hlzuGD1zOhDsqa)4q?!YBf9nrR(K zbX!~YykrEU%oItrG(C@nzso(omguE20qVYAB4=fywtawD&qrt#iLqw5=AAdecL_t(oh3%JFmg67{MGZoXf&DMH zB|)$u*iNVW(>g^`m0L0I2{CQk6Hh$x#1l{SP>O$k$!)b?8_qmbH1y7mWNyNNzaK*K263+~D?!A#VJ)nES5CTr0 z4IXwrht8!cj3uwC{EDNa`N4SsBPBHVyz{j|`pT=ym04EhzgCsl`Sbw#wl3MR!sv3* z3;QFVf~GbVCW&PAp9$Xi>t%r3Y=BI8?tc=gM34p5PmT(!!OHg!4hevgB1bB)vY$%l z<)g$9d48}&Lk8aEfD3*Yq0XUpNX8*hh6C_Gilny&Rw!d6T*l|9u-Q#bV4CgME>bs; zU>+dk)j;29jX%!1Ba&8d#z=a(V7=y@dUemKX89=&=a6UpqlOX1T+Ja{ePyf z1ut>favtAX&NY{(^An-Y6xwN^e^&c9AaURvrrT=?Fox#1F_Zm00iFBF0g17hq6(yG zh8S6NUt6wu%?L%EDS->kzl)}3SlkSpmx9Xo1c0ovFxlS|(D}i>1dVLTRbhzEQ5TK` zI_K4Qd~46dw$otyyXUWF?8sYAVSh>hJv2`CTLMPD+phvk_M*@_FwW3^Pf6CX&w)G6 zL1(l&Q}_jsN48eLFmMRY+FXT%=La~I&ib%Vt}^F zwpYeXTjjx=sQKjMQo`p{lx+g16KhMrz~^}!qSA$y*LD`FK;tKeH5Ub1d4EwDv!~y; zIc~VBV@L@WFGti8F!IrU2s%-m?X;aMI6dsCP4g(xGM6*`w#^FfIR6Lbgi3Q;uy6QQ zk3wwV^fby#v{@gwMPQxk<3e3q6Nexq#$$`DlS>@y2 zb;oH=$!1SQVwYEzJ1%`(-&tpfUkni`O3Bg&VX4;E6>`Zb!|lFvIs(^R;^syPH$y}l zv^%*Be8aWZNbP6-Mf}s1^FAoImsj>X{zd%TrT>ZlAAbOakT6mOhI7FH0000 Date: Tue, 10 Sep 2024 17:52:49 -0400 Subject: [PATCH 14/52] Fix stat id check (#5366) --- src/battle_ai_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 06735d6015..d50410186f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -863,7 +863,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; } From c57d149003929c71f7b44c27841c432ad39018ac Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 10 Sep 2024 23:53:55 +0200 Subject: [PATCH 15/52] Fixes with Pledge combos and absorption abilities (#5364) * Fixes with Pledge combos and absorption moves * Fixed incorrect merge * Removed superflous if statement --------- Co-authored-by: Hedara --- src/battle_util.c | 4 + test/battle/move_effect/pledge.c | 213 +++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index f6c577a31c..b2cf51ba0c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5313,6 +5313,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } if (caseID == ABILITYEFFECT_WOULD_ABSORB) { + gBattleStruct->pledgeMove = FALSE; if (effect && gLastUsedAbility != 0xFFFF) RecordAbilityBattle(battler, gLastUsedAbility); @@ -5320,6 +5321,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } else if (effect == 1) // Drain Hp ability. { + gBattleStruct->pledgeMove = FALSE; if (BATTLER_MAX_HP(battler) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) @@ -5342,6 +5344,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } else if (effect == 2) // Boost Stat ability; { + gBattleStruct->pledgeMove = FALSE; if (!CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) @@ -5363,6 +5366,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } else if (effect == 3) { + gBattleStruct->pledgeMove = FALSE; if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index 2220b74186..d2cc16aa47 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -836,3 +836,216 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move HP_BAR(opponentLeft); } } + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Electrify") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_MAROWAK) { Ability(ABILITY_LIGHTNING_ROD); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_ELECTRIFY, target: opponentRight); + MOVE(opponentLeft, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Storm Drain") +{ + GIVEN { + PLAYER(SPECIES_GASTRODON) { Ability(ABILITY_STORM_DRAIN); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Sap Sipper") +{ + GIVEN { + PLAYER(SPECIES_GOODRA) { Ability(ABILITY_SAP_SIPPER); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_FIRE_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Dry Skin") +{ + GIVEN { + PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Flash Fire") +{ + GIVEN { + PLAYER(SPECIES_HEATRAN) { Ability(ABILITY_FLASH_FIRE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Motor Drive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_ELECTRIFY, target: opponentRight); + MOVE(opponentLeft, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_FIRE_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Volt Absorb") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_ELECTRIFY, target: opponentRight); + MOVE(opponentLeft, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Water Absorb") +{ + GIVEN { + PLAYER(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_WATER_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Well Baked Body") +{ + GIVEN { + PLAYER(SPECIES_DACHSBUN) { Ability(ABILITY_WELL_BAKED_BODY); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_FIRE_PLEDGE, target: playerLeft); + MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentRight); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASS_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, playerLeft); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); + HP_BAR(opponentRight); + } +} From cdf781f7262cb5b4c456aaa159adfe4f72f3b205 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 11 Sep 2024 06:18:58 -0300 Subject: [PATCH 16/52] Fixed Toxic Thread stat increase (#5369) --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c24dacb5c4..e042201d94 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1838,7 +1838,7 @@ BattleScript_HitSwitchTargetForceRandomSwitchFailed: goto BattleScript_MoveEnd BattleScript_EffectToxicThread:: - setstatchanger STAT_SPEED, 2, TRUE + setstatchanger STAT_SPEED, 1, TRUE attackcanceler jumpifsubstituteblocks BattleScript_FailedFromAtkString jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_ToxicThreadWorks From 5d8c61d8137a68762993d738ba94d889dcde01eb Mon Sep 17 00:00:00 2001 From: Liamjd14 Date: Thu, 12 Sep 2024 17:55:30 +0100 Subject: [PATCH 17/52] 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 18/52] 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 19/52] 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 20/52] 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 21/52] 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 22/52] 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 23/52] 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 24/52] 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 25/52] 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 26/52] 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 27/52] 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 28/52] 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 29/52] 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 30/52] 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 31/52] 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 32/52] 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 33/52] 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 34/52] 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 35/52] 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 36/52] 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 37/52] 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 38/52] 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 39/52] 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 40/52] 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 41/52] 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 42/52] 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 43/52] 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 44/52] 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 45/52] 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 { From 5908fbef9cbdf42f26128e69396d5ab8106a8832 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 29 Sep 2024 12:34:34 -0400 Subject: [PATCH 46/52] Wake-Up Slap test typo (#5442) * Wake-Up Slap test typo * Update test/battle/move_effect/wake_up_slap.c Co-authored-by: Eduardo Quezada --------- Co-authored-by: Eduardo Quezada --- test/battle/move_effect/wake_up_slap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/move_effect/wake_up_slap.c b/test/battle/move_effect/wake_up_slap.c index 2c9dd7ed24..20b22ca660 100644 --- a/test/battle/move_effect/wake_up_slap.c +++ b/test/battle/move_effect/wake_up_slap.c @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substit } } -SINGLE_BATTLE_TEST("Wake-Up Slap get incread power vs. sleeping targets") +SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") { u32 status1; PARAMETRIZE { status1 = STATUS1_SLEEP; } From 4183fa9d5067199a4a601bc4947ed430b0f641de Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 29 Sep 2024 14:40:37 -0300 Subject: [PATCH 47/52] Fixed test assumption fail summary fields using more memory than needed (#5443) --- tools/mgba-rom-test-hydra/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/mgba-rom-test-hydra/main.c b/tools/mgba-rom-test-hydra/main.c index d9d8417e18..2c49b1dde8 100644 --- a/tools/mgba-rom-test-hydra/main.c +++ b/tools/mgba-rom-test-hydra/main.c @@ -65,8 +65,8 @@ struct Runner char failed_TestFilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; char knownFailingPassed_TestNames[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; char knownFailingPassed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; - char assumeFailed_TestNames[MAX_SUMMARY_TESTS_TO_LIST * MAX_PROCESSES][MAX_TEST_LIST_BUFFER_LENGTH]; - char assumeFailed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST * MAX_PROCESSES][MAX_TEST_LIST_BUFFER_LENGTH]; + char assumeFailed_TestNames[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; + char assumeFailed_FilenameLine[MAX_SUMMARY_TESTS_TO_LIST][MAX_TEST_LIST_BUFFER_LENGTH]; }; static unsigned nrunners = 0; From 1c022f4d34ef4fdf6a894815fd4b4617b15932ed Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sun, 29 Sep 2024 16:05:54 -0500 Subject: [PATCH 48/52] Fix Jubilife Muffin full heal effect + better full heal tests (#5444) --- src/data/items.h | 1 + test/battle/item_effect/cure_status.c | 81 +++++++++++++++++++-------- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index adfb1914a2..75629d579f 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -13867,6 +13867,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, + .effect = gItemEffect_FullHeal, .flingPower = 30, .iconPic = gItemIcon_JubilifeMuffin, .iconPalette = gItemIconPalette_JubilifeMuffin, diff --git a/test/battle/item_effect/cure_status.c b/test/battle/item_effect/cure_status.c index 6c7cc2e64d..7f5601ab3c 100644 --- a/test/battle/item_effect/cure_status.c +++ b/test/battle/item_effect/cure_status.c @@ -94,11 +94,14 @@ SINGLE_BATTLE_TEST("Burn Heal heals a battler from being burned") } } -SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen") +SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen or frostbite") { + u16 status; + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_ICE_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { USE_ITEM(player, ITEM_ICE_HEAL, partyIndex: 0); } @@ -112,12 +115,13 @@ SINGLE_BATTLE_TEST("Ice Heal heals a battler from being frozen") SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_FULL_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -134,12 +138,13 @@ SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_HEAL_POWDER].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -156,12 +161,13 @@ SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_PEWTER_CRUNCHIES].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -178,12 +184,13 @@ SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") SINGLE_BATTLE_TEST("Lava Cookies heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_LAVA_COOKIE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -200,12 +207,13 @@ SINGLE_BATTLE_TEST("Lava Cookies heals a battler from any primary status") SINGLE_BATTLE_TEST("Rage Candy Bar heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_RAGE_CANDY_BAR].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -222,12 +230,13 @@ SINGLE_BATTLE_TEST("Rage Candy Bar heals a battler from any primary status") SINGLE_BATTLE_TEST("Old Gateu heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_OLD_GATEAU].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -244,12 +253,13 @@ SINGLE_BATTLE_TEST("Old Gateu heals a battler from any primary status") SINGLE_BATTLE_TEST("Casteliacone heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_CASTELIACONE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -266,12 +276,13 @@ SINGLE_BATTLE_TEST("Casteliacone heals a battler from any primary status") SINGLE_BATTLE_TEST("Lumiose Galette heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_LUMIOSE_GALETTE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -288,12 +299,13 @@ SINGLE_BATTLE_TEST("Lumiose Galette heals a battler from any primary status") SINGLE_BATTLE_TEST("Shalour Sable heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_SHALOUR_SABLE].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -310,12 +322,13 @@ SINGLE_BATTLE_TEST("Shalour Sable heals a battler from any primary status") SINGLE_BATTLE_TEST("Big Malasada heals a battler from any primary status") { u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_BURN; } PARAMETRIZE { status = STATUS1_FREEZE; } PARAMETRIZE { status = STATUS1_PARALYSIS; } - PARAMETRIZE { status = STATUS1_POISON; } PARAMETRIZE { status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } GIVEN { ASSUME(gItemsInfo[ITEM_BIG_MALASADA].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) { Status1(status); } @@ -329,6 +342,29 @@ SINGLE_BATTLE_TEST("Big Malasada heals a battler from any primary status") } } +SINGLE_BATTLE_TEST("Jubilife Muffin heals a battler from any primary status") +{ + u16 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_BURN; } + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } + GIVEN { + ASSUME(gItemsInfo[ITEM_JUBILIFE_MUFFIN].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(player, ITEM_JUBILIFE_MUFFIN, partyIndex: 0); } + } SCENE { + MESSAGE("Wobbuffet had its status healed!"); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler from being confused") { u16 item; @@ -342,6 +378,7 @@ SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler PARAMETRIZE { item = ITEM_LUMIOSE_GALETTE; } PARAMETRIZE { item = ITEM_SHALOUR_SABLE; } PARAMETRIZE { item = ITEM_BIG_MALASADA; } + PARAMETRIZE { item = ITEM_JUBILIFE_MUFFIN; } GIVEN { ASSUME(gItemsInfo[item].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET); From b93e58266e03e9c9a9592ededa40629b67604bdd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:43:58 +0200 Subject: [PATCH 49/52] Fixes recoil moves not triggering berries if possible (#5449) * Fixes recoil moves not triggering berries if possible * Update battle_script_commands.h --- include/constants/battle_script_commands.h | 84 +++++++++++----------- src/battle_script_commands.c | 7 +- test/battle/hold_effect/restore_hp.c | 36 ++++++++++ 3 files changed, 86 insertions(+), 41 deletions(-) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 03173c43cf..901a76c1a8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -273,46 +273,50 @@ #define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen // cases for Cmd_moveend -#define MOVEEND_SUM_DAMAGE 0 -#define MOVEEND_PROTECT_LIKE_EFFECT 1 -#define MOVEEND_RAGE 2 -#define MOVEEND_SYNCHRONIZE_TARGET 3 -#define MOVEEND_ABILITIES 4 -#define MOVEEND_ABILITIES_ATTACKER 5 -#define MOVEEND_STATUS_IMMUNITY_ABILITIES 6 -#define MOVEEND_SYNCHRONIZE_ATTACKER 7 -#define MOVEEND_CHOICE_MOVE 8 -#define MOVEEND_ATTACKER_INVISIBLE 9 -#define MOVEEND_ATTACKER_VISIBLE 10 -#define MOVEEND_TARGET_VISIBLE 11 -#define MOVEEND_ITEM_EFFECTS_TARGET 12 -#define MOVEEND_MOVE_EFFECTS2 13 -#define MOVEEND_ITEM_EFFECTS_ALL 14 -#define MOVEEND_KINGSROCK 15 // These item effects will occur each strike of a multi-hit move -#define MOVEEND_NUM_HITS 16 -#define MOVEEND_SUBSTITUTE 17 -#define MOVEEND_SKY_DROP_CONFUSE 18 -#define MOVEEND_UPDATE_LAST_MOVES 19 -#define MOVEEND_MIRROR_MOVE 20 -#define MOVEEND_NEXT_TARGET 21 // Everything up until here is handled for each strike of a multi-hit move -#define MOVEEND_MULTIHIT_MOVE 22 -#define MOVEEND_DEFROST 23 -#define MOVEEND_RECOIL 24 -#define MOVEEND_MAGICIAN 25 // Occurs after final multi-hit strike, and after other items/abilities would activate -#define MOVEEND_EJECT_ITEMS 26 -#define MOVEEND_WHITE_HERB 27 -#define MOVEEND_RED_CARD 28 -#define MOVEEND_LIFEORB_SHELLBELL 29 // Includes shell bell, throat spray, etc -#define MOVEEND_CHANGED_ITEMS 30 -#define MOVEEND_PICKPOCKET 31 -#define MOVEEND_DANCER 32 -#define MOVEEND_EMERGENCY_EXIT 33 -#define MOVEEND_SYMBIOSIS 34 -#define MOVEEND_OPPORTUNIST 35 // Occurs after other stat change items/abilities to try and copy the boosts -#define MOVEEND_SAME_MOVE_TURNS 36 -#define MOVEEND_SET_EVOLUTION_TRACKER 37 -#define MOVEEND_CLEAR_BITS 38 -#define MOVEEND_COUNT 39 +enum MoveEndEffects +{ + MOVEEND_SUM_DAMAGE, + MOVEEND_PROTECT_LIKE_EFFECT, + MOVEEND_RAGE, + MOVEEND_SYNCHRONIZE_TARGET, + MOVEEND_ABILITIES, + MOVEEND_ABILITIES_ATTACKER, + MOVEEND_STATUS_IMMUNITY_ABILITIES, + MOVEEND_SYNCHRONIZE_ATTACKER, + MOVEEND_CHOICE_MOVE, + MOVEEND_ATTACKER_INVISIBLE, + MOVEEND_ATTACKER_VISIBLE, + MOVEEND_TARGET_VISIBLE, + MOVEEND_ITEM_EFFECTS_TARGET, + MOVEEND_MOVE_EFFECTS2, + MOVEEND_ITEM_EFFECTS_ALL, + MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move + MOVEEND_NUM_HITS, + MOVEEND_SUBSTITUTE, + MOVEEND_SKY_DROP_CONFUSE, + MOVEEND_UPDATE_LAST_MOVES, + MOVEEND_MIRROR_MOVE, + MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a multi-hit move + MOVEEND_MULTIHIT_MOVE, + MOVEEND_DEFROST, + MOVEEND_RECOIL, + MOVEEND_ITEM_EFFECTS_ATTACKER, + MOVEEND_MAGICIAN, // Occurs after final multi-hit strike, and after other items/abilities would activate + MOVEEND_EJECT_ITEMS, + MOVEEND_WHITE_HERB, + MOVEEND_RED_CARD, + MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc + MOVEEND_CHANGED_ITEMS, + MOVEEND_PICKPOCKET, + MOVEEND_DANCER, + MOVEEND_EMERGENCY_EXIT, + MOVEEND_SYMBIOSIS, + MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts + MOVEEND_SAME_MOVE_TURNS, + MOVEEND_SET_EVOLUTION_TRACKER, + MOVEEND_CLEAR_BITS, + MOVEEND_COUNT, +}; // switch cases #define B_SWITCH_NORMAL 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b018535cbe..aa92a7b884 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5614,6 +5614,11 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_ITEM_EFFECTS_ATTACKER: + if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker, FALSE)) + effect = TRUE; + gBattleScripting.moveendState++; + break; case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0)) effect = TRUE; @@ -11570,7 +11575,7 @@ static void Cmd_stockpiletohpheal(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; - + gBattlescriptCurrInstr = cmd->nextInstr; gBattlerTarget = gBattlerAttacker; } diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index 09daecc860..c19433751c 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -27,3 +27,39 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing") MESSAGE("The opposing Foe Wobbuffet was hurt by the sea of fire!"); } } + +DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil move") +{ + u16 item; + + PARAMETRIZE { item = ITEM_BERRY_JUICE; } + PARAMETRIZE { item = ITEM_ORAN_BERRY; } + PARAMETRIZE { item = ITEM_SITRUS_BERRY; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_TAKE_DOWN].recoil == 25); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_TAKE_DOWN, target: playerLeft); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_CELEBRATE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAKE_DOWN, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} From d5560bbc87715e660d09dd8911f3b4671f5a49ec Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Wed, 2 Oct 2024 14:20:02 -0500 Subject: [PATCH 50/52] Remove trailing whitespace pass 10-2-2024 (Master) (#5455) --- src/battle_ai_main.c | 2 +- src/data/graphics/pokemon.h | 2 +- src/data/pokemon/species_info/gen_9_families.h | 2 +- test/battle/ai/ai_switching.c | 2 +- test/battle/gimmick/dynamax.c | 2 +- test/battle/move_effect/pledge.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1483c875ba..903b0c7d9f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2869,7 +2869,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (atkPartnerAbility) { case ABILITY_ANGER_POINT: - if (gMovesInfo[move].alwaysCriticalHit == TRUE + if (gMovesInfo[move].alwaysCriticalHit == TRUE && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && AI_IsFaster(battlerAtk, battlerAtkPartner, move) && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 1)) diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index a1c1a20108..284977bcc2 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -21882,7 +21882,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gShinyOverworldPalette_OgerponCornerstoneMask[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/overworld_shiny.gbapal.lz"); const u32 gOverworldPalette_OgerponTealMask[] = INCBIN_U32("graphics/pokemon/ogerpon/overworld_normal.gbapal.lz"); const u32 gShinyOverworldPalette_OgerponTealMask[] = INCBIN_U32("graphics/pokemon/ogerpon/overworld_shiny.gbapal.lz"); - + const u32 gObjectEventPic_OgerponTealMaskTeraTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/overworld.4bpp"); const u32 gObjectEventPic_OgerponWellspringMaskTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/wellspring/overworld.4bpp"); const u32 gObjectEventPic_OgerponHearthflameMaskTera[] = INCBIN_COMP("graphics/pokemon/ogerpon/hearthflame/overworld.4bpp"); diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 650b3c5a07..5a616bf4ff 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -7237,7 +7237,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = TRACKS_FOOT, gOverworldPalette_Fezandipiti, gShinyOverworldPalette_Fezandipiti - ) + ) .isLegendary = TRUE, .levelUpLearnset = sFezandipitiLevelUpLearnset, .teachableLearnset = sFezandipitiTeachableLearnset, diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 6fb9b499d9..3e97ec1f61 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -420,5 +420,5 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't d OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHADOW_BALL); } } WHEN { TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_SWITCH(opponent, 1); } - } + } } diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index f9865f7b6c..3df3cc4cdf 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1505,7 +1505,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } - + GIVEN { ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC); diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index 2098217827..bd68b1e733 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -823,7 +823,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move OPPONENT(SPECIES_WYNAUT) { Speed(5); Status1(STATUS1_SLEEP_TURN(2)); } } WHEN { TURN { MOVE(opponentLeft, MOVE_FIRE_PLEDGE, target: playerLeft); - MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); + MOVE(opponentRight, MOVE_GRASS_PLEDGE, target: playerLeft); MOVE(playerLeft, MOVE_GRASS_PLEDGE, target: opponentRight); } } SCENE { NONE_OF { From be5f2e095e7fc0e45f33e87a3a83c4df53ff5a28 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Thu, 3 Oct 2024 07:01:18 -0400 Subject: [PATCH 51/52] fix duplicating flute glitch (#5436) Co-authored-by: ghoulslash --- include/party_menu.h | 1 + src/battle_controller_player.c | 4 ++-- src/party_menu.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/party_menu.h b/include/party_menu.h index a34f06cec6..abea29b6bb 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -102,5 +102,6 @@ void MoveDeleterForgetMove(void); void BufferMoveDeleterNicknameAndMove(void); void GetNumMovesSelectedMonHas(void); void MoveDeleterChooseMoveToForget(void); +bool32 IsItemFlute(u16 item); #endif // GUARD_PARTY_MENU_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index bcdab75081..8907d94733 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -387,8 +387,8 @@ static void HandleInputChooseAction(u32 battler) && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - // Return item to bag if partner had selected one. - if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM) + // Return item to bag if partner had selected one (except flutes). + if (gBattleResources->bufferA[battler][1] == B_ACTION_USE_ITEM && !IsItemFlute(itemId)) { AddBagItem(itemId, 1); } diff --git a/src/party_menu.c b/src/party_menu.c index 32ccd6ca19..3fef465804 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4578,7 +4578,7 @@ static bool8 NotUsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item) return TRUE; } -static bool8 IsItemFlute(u16 item) +bool32 IsItemFlute(u16 item) { if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE) return TRUE; From 91325e83c185700d5cc65ef2f01dbba4b9c61bd4 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:00:12 +0100 Subject: [PATCH 52/52] Fixes to Protosynthesis, Quark Drive, Beast Boost, Orichalcum Pulse, Hadron Engine (#5447) * Protosynthesis & Quark Drive interactions; Fixes to Beast Boost/Protosynthesis/Quark Drive stat tie priority, Orichalcum Pulse and Hadron Engine stat boost * Protosynthesis + Quark Drive tests * Update src/battle_util.c * Update src/battle_util.c * Update src/battle_util.c * Update src/battle_util.c * Update src/battle_util.c * Update src/battle_util.c --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_main.c | 4 +- src/battle_script_commands.c | 5 +- src/battle_util.c | 40 ++++++--- test/battle/ability/protosynthesis.c | 125 ++++++++++++++++++++++++++- test/battle/ability/quark_drive.c | 106 +++++++++++++++++++++++ 5 files changed, 260 insertions(+), 20 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index a9336c3f8b..3f4f140f65 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4743,9 +4743,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && (gBattleWeather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battler])) + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battler))) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; // stat stages diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index aa92a7b884..f16ee0bf76 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8777,12 +8777,15 @@ u32 GetHighestStatId(u32 battler) for (i = STAT_DEF; i < NUM_STATS; i++) { u16 *statVal = &gBattleMons[battler].attack + (i - 1); - if (*statVal > highestStat) + if (*statVal > highestStat && i != STAT_SPEED) { highestStat = *statVal; highestId = i; } } + if (gBattleMons[battler].speed > highestStat) + highestId = STAT_SPEED; + return highestId; } diff --git a/src/battle_util.c b/src/battle_util.c index 86e846d09c..2e463eaf58 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6329,7 +6329,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_PROTOSYNTHESIS: - if (!gDisableStructs[battler].weatherAbilityDone && IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) + if (!gDisableStructs[battler].weatherAbilityDone + && (gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) { gDisableStructs[battler].weatherAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6355,7 +6358,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_QUARK_DRIVE: - if (!gDisableStructs[battler].terrainAbilityDone && IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (!gDisableStructs[battler].terrainAbilityDone + && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) { gDisableStructs[battler].terrainAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -7594,7 +7600,8 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_BOOSTER_ENERGY: if (!(gBattleStruct->boosterEnergyActivates & gBitTable[battler]) - && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -7861,7 +7868,8 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_BOOSTER_ENERGY: if (!(gBattleStruct->boosterEnergyActivates & gBitTable[battler]) - && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !(gBattleWeather & B_WEATHER_SUN)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT)) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -9285,25 +9293,27 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerAtk]) - && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) + if (((weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + && !(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; case ABILITY_QUARK_DRIVE: { u8 atkHighestStat = GetHighestStatId(battlerAtk); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerAtk]) - && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK))) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) + && ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + && !(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } break; case ABILITY_ORICHALCUM_PULSE: - if (weather & B_WEATHER_SUN) + if (weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT && IS_MOVE_PHYSICAL(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_HADRON_ENGINE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IS_MOVE_SPECIAL(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_SHARPNESS: @@ -9363,16 +9373,18 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((weather & B_WEATHER_SUN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerDef]) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) + if (((weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & gBitTable[battlerDef]) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF))) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) + && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 58f10b366f..2be9f81d28 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -100,6 +100,125 @@ SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in") } } -TO_DO_BATTLE_TEST("Protosynthesis activates in sun before Booster Energy"); -TO_DO_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella"); -TO_DO_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Protosynthesis boosts Attack 1st in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Attack was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Defense 2nd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Defense was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Special Attack 3rd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis boosts Special Defense 4th in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("Great Tusk's Sp. Def was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis activates in Sun before Booster Energy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis doesn't activate for a transformed battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Item(ITEM_BOOSTER_ENERGY); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_TRANSFORM); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_PROTOSYNTHESIS); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->ability, ABILITY_PROTOSYNTHESIS); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella") +{ + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_UTILITY_UMBRELLA); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field") +{ + u32 species, ability; + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + + GIVEN { + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ABILITY_POPUP(opponent, ability); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NOT ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + } +} diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 4e81b012ae..928ee45eb5 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -100,3 +100,109 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in") MESSAGE("Iron Moth's Sp. Atk was heightened!"); } } + +SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not grounded") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_IRON_JUGULIS].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_IRON_JUGULIS].types[1] == TYPE_FLYING); + PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Attack 1st in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Attack was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Defense 2nd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Defense was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Special Attack 3rd in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive boosts Special Defense 4th in case of a stat tie") +{ + GIVEN { + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + MESSAGE("Iron Treads's Sp. Def was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Quark Drive activates in Electric Terrain before Booster Energy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + } +} + +SINGLE_BATTLE_TEST("Quark Drive doesn't activate for a transformed battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Item(ITEM_BOOSTER_ENERGY); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_TRANSFORM); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponent); + NOT ABILITY_POPUP(opponent, ABILITY_QUARK_DRIVE); + } THEN { + EXPECT_EQ(player->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->item, ITEM_BOOSTER_ENERGY); + EXPECT_EQ(opponent->ability, ABILITY_QUARK_DRIVE); + } +}